Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a26f6ba authored by Felix Bechstein's avatar Felix Bechstein
Browse files

Vibrator/airplane overrides (1/2 Frameworks)

Add vibrator overrides for ringer and notification:
* enable
* disable
* only when silent

Add airplane mode overrides:
* enable
* disable

Patch Set 1:
initial patch

Patch Set 2:
remove airplane mode 'enable, leave nfc enabled'

Change-Id: I2efa3e5ef95574b04f872ed970090e507189be2b
parent 91acfd28
Loading
Loading
Loading
Loading
+90 −1
Original line number Diff line number Diff line
@@ -17,10 +17,12 @@
package android.app;

import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Parcel;
import android.os.ParcelUuid;
import android.os.Parcelable;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;

@@ -64,8 +66,12 @@ public final class Profile implements Parcelable, Comparable {

    private Map<Integer, ConnectionSettings> connections = new HashMap<Integer, ConnectionSettings>();

    private Map<Integer, VibratorSettings> vibrators = new HashMap<Integer, VibratorSettings>();

    private int mScreenLockMode = LockMode.DEFAULT;

    private int mAirplaneMode = AirplaneMode.DEFAULT;

    /** @hide */
    public static class LockMode {
        public static final int DEFAULT = 0;
@@ -73,6 +79,13 @@ public final class Profile implements Parcelable, Comparable {
        public static final int DISABLE = 2;
    }

    /** @hide */
    public static class AirplaneMode {
        public static final int DEFAULT = 0;
        public static final int ENABLE = 1;
        public static final int DISABLE = 2;
    }

    /** @hide */
    public static final Parcelable.Creator<Profile> CREATOR = new Parcelable.Creator<Profile>() {
        public Profile createFromParcel(Parcel in) {
@@ -168,7 +181,9 @@ public final class Profile implements Parcelable, Comparable {
                streams.values().toArray(new Parcelable[streams.size()]), flags);
        dest.writeParcelableArray(
                connections.values().toArray(new Parcelable[connections.size()]), flags);
        dest.writeParcelableArray(vibrators.values().toArray(new Parcelable[vibrators.size()]), flags);
        dest.writeInt(mScreenLockMode);
        dest.writeInt(mAirplaneMode);
    }

    /** @hide */
@@ -194,7 +209,12 @@ public final class Profile implements Parcelable, Comparable {
            ConnectionSettings connection = (ConnectionSettings) parcel;
            connections.put(connection.getConnectionId(), connection);
        }
        for (Parcelable parcel : in.readParcelableArray(null)) {
            VibratorSettings vibrator = (VibratorSettings) parcel;
            vibrators.put(vibrator.getVibratorId(), vibrator);
        }
        mScreenLockMode = in.readInt();
        mAirplaneMode = in.readInt();
    }

    public String getName() {
@@ -254,6 +274,19 @@ public final class Profile implements Parcelable, Comparable {
        mDirty = true;
    }

    public int getAirplaneMode() {
        return mAirplaneMode;
    }

    public void setAirplaneMode(int airplaneMode) {
        if (airplaneMode < AirplaneMode.DEFAULT || airplaneMode > AirplaneMode.DISABLE) {
            mAirplaneMode = AirplaneMode.DEFAULT;
        } else {
            mAirplaneMode = airplaneMode;
        }
        mDirty = true;
    }

    /** @hide */
    public boolean isDirty() {
        if (mDirty) {
@@ -274,6 +307,11 @@ public final class Profile implements Parcelable, Comparable {
                return true;
            }
        }
        for (VibratorSettings vibrator : vibrators.values()) {
            if (vibrator.isDirty()) {
                return true;
            }
        }
        return false;
    }

@@ -301,7 +339,11 @@ public final class Profile implements Parcelable, Comparable {

        builder.append("<screen-lock-mode>");
        builder.append(mScreenLockMode);
        builder.append("</screen-lock-mode>");
        builder.append("</screen-lock-mode>\n");

        builder.append("<airplane-mode>");
        builder.append(mAirplaneMode);
        builder.append("</airplane-mode>\n");

        for (ProfileGroup pGroup : profileGroups.values()) {
            pGroup.getXmlString(builder, context);
@@ -312,6 +354,9 @@ public final class Profile implements Parcelable, Comparable {
        for (ConnectionSettings cs : connections.values()) {
            cs.getXmlString(builder, context);
        }
        for (VibratorSettings vs : vibrators.values()) {
            vs.getXmlString(builder, context);
        }
        builder.append("</profile>\n");
        mDirty = false;
    }
@@ -367,6 +412,9 @@ public final class Profile implements Parcelable, Comparable {
                if (name.equals("screen-lock-mode")) {
                    profile.setScreenLockMode(Integer.valueOf(xpp.nextText()));
                }
                if (name.equals("airplane-mode")) {
                    profile.setAirplaneMode(Integer.valueOf(xpp.nextText()));
                }
                if (name.equals("profileGroup")) {
                    ProfileGroup pg = ProfileGroup.fromXml(xpp, context);
                    profile.addProfileGroup(pg);
@@ -379,6 +427,10 @@ public final class Profile implements Parcelable, Comparable {
                    ConnectionSettings cs = ConnectionSettings.fromXml(xpp, context);
                    profile.connections.put(cs.getConnectionId(), cs);
                }
                if (name.equals("vibratorDescriptor")) {
                    VibratorSettings vs = VibratorSettings.fromXml(xpp, context);
                    profile.setVibratorSettings(vs);
                }
            }
            event = xpp.next();
        }
@@ -404,6 +456,27 @@ public final class Profile implements Parcelable, Comparable {
                cs.processOverride(context);
            }
        }
        // Set vibrators
        for (VibratorSettings vs : vibrators.values()) {
            if (vs.isOverride()) {
                vs.processOverride(context);
            }
        }
        // Set airplane mode
        doSelectAirplaneMode(context);
    }

    private void doSelectAirplaneMode(Context context) {
        if (getAirplaneMode() != AirplaneMode.DEFAULT) {
            int current = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0);
            int target = getAirplaneMode();
            if (current == 1 && target == AirplaneMode.DISABLE || current == 0 && target == AirplaneMode.ENABLE) {
                Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 1 - current);
                Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
                intent.putExtra("state", target != AirplaneMode.DISABLE);
                context.sendBroadcast(intent);
            }
        }
    }

    /** @hide */
@@ -422,6 +495,22 @@ public final class Profile implements Parcelable, Comparable {
        return streams.values();
    }

    /** @hide */
    public VibratorSettings getSettingsForVibrator(int vibratorId) {
        return vibrators.get(vibratorId);
    }

    /** @hide */
    public void setVibratorSettings(VibratorSettings descriptor) {
        vibrators.put(descriptor.getVibratorId(), descriptor);
        mDirty = true;
    }

    /** @hide */
    public Collection<VibratorSettings> getVibratorSettings() {
        return vibrators.values();
    }

    /** @hide */
    public ConnectionSettings getSettingsForConnection(int connectionId){
        return connections.get(connectionId);
+150 −0
Original line number Diff line number Diff line

package android.app;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.media.AudioManager;
import android.os.Parcel;
import android.os.Parcelable;

import java.io.IOException;

/** @hide */
public final class VibratorSettings implements Parcelable{

    public static final int OFF = 0;
    public static final int SILENT = 1;
    public static final int ON = 2;

    private int mVibratorId;
    private int mValue;
    private boolean mOverride;
    private boolean mDirty;

    /** @hide */
    public static final Parcelable.Creator<VibratorSettings> CREATOR = new Parcelable.Creator<VibratorSettings>() {
        public VibratorSettings createFromParcel(Parcel in) {
            return new VibratorSettings(in);
        }

        @Override
        public VibratorSettings[] newArray(int size) {
            return new VibratorSettings[size];
        }
    };


    public VibratorSettings(Parcel parcel) {
        readFromParcel(parcel);
    }

    public VibratorSettings(int vibratorId) {
        this(vibratorId, 0, false);
    }

    public VibratorSettings(int vibratorId, int value, boolean override) {
        mVibratorId = vibratorId;
        mValue = value;
        mOverride = override;
        mDirty = false;
    }

    public int getVibratorId() {
        return mVibratorId;
    }

    public int getValue() {
        return mValue;
    }

    public void setValue(int value) {
        mValue = value;
        mDirty = true;
    }

    public void setOverride(boolean override) {
        mOverride = override;
        mDirty = true;
    }

    public boolean isOverride() {
        return mOverride;
    }

    /** @hide */
    public boolean isDirty() {
        return mDirty;
    }

    /** @hide */
    public static VibratorSettings fromXml(XmlPullParser xpp, Context context)
            throws XmlPullParserException, IOException {
        int event = xpp.next();
        VibratorSettings vibratorDescriptor = new VibratorSettings(0);
        while (event != XmlPullParser.END_TAG || !xpp.getName().equals("vibratorDescriptor")) {
            if (event == XmlPullParser.START_TAG) {
                String name = xpp.getName();
                if (name.equals("vibratorId")) {
                    vibratorDescriptor.mVibratorId = Integer.parseInt(xpp.nextText());
                } else if (name.equals("value")) {
                    vibratorDescriptor.mValue = Integer.parseInt(xpp.nextText());
                } else if (name.equals("override")) {
                    vibratorDescriptor.mOverride = Boolean.parseBoolean(xpp.nextText());
                }
            }
            event = xpp.next();
        }
        return vibratorDescriptor;
    }

    /** @hide */
    public void getXmlString(StringBuilder builder, Context context) {
        builder.append("<vibratorDescriptor>\n<vibratorId>");
        builder.append(mVibratorId);
        builder.append("</vibratorId>\n<value>");
        builder.append(mValue);
        builder.append("</value>\n<override>");
        builder.append(mOverride);
        builder.append("</override>\n</vibratorDescriptor>\n");
        mDirty = false;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    /** @hide */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mVibratorId);
        dest.writeInt(mOverride ? 1 : 0);
        dest.writeInt(mValue);
        dest.writeInt(mDirty ? 1 : 0);
    }

    /** @hide */
    public void readFromParcel(Parcel in) {
        mVibratorId = in.readInt();
        mOverride = in.readInt() != 0;
        mValue = in.readInt();
        mDirty = in.readInt() != 0;
    }

    /** @hide */
    public void processOverride(Context context) {
        AudioManager amgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        switch (mValue) {
        case OFF:
            amgr.setVibrateSetting(mVibratorId, AudioManager.VIBRATE_SETTING_OFF);
            break;
        case SILENT:
            amgr.setVibrateSetting(mVibratorId, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
        default:
            amgr.setVibrateSetting(mVibratorId, AudioManager.VIBRATE_SETTING_ON);
            break;
        }
    }
}