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

Commit 1045477d authored by Bill Lin's avatar Bill Lin
Browse files

Create OneHandedSettingsUtil handle settings configs (5/N)

Implement a tool to query Settings provider quickly

Test: atest OneHandedDisplayAreaOrganizerTest
Test: atest OneHandedManagerImplTest
Test: atest OneHandedUITest
Test: atest OneHandedSettingsUtilTest
Test: atest SystemUITests
Bug: 150747909
Change-Id: I39822a96fca9331d2b659c767b3d9f057c39fc6d
parent 6f9ddb4b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -490,6 +490,9 @@
    <!-- On debuggable builds, alert the user if SystemUI PSS goes over this number (in kb) -->
    <integer name="watch_heap_limit">256000</integer>

    <!-- One handed mode default offset % of display size -->
    <fraction name="config_one_handed_offset">50%</fraction>

    <!-- Animation duration for resizing of PIP when entering/exiting. -->
    <integer name="config_pipResizeAnimationDuration">425</integer>

@@ -570,4 +573,5 @@
    <integer name="controls_max_columns_adjust_below_width_dp">320</integer>
    <!-- If the config font scale is >= this value, potentially adjust the number of columns-->
    <item name="controls_max_columns_adjust_above_font_scale" translatable="false" format="float" type="dimen">1.25</item>

</resources>
+5 −0
Original line number Diff line number Diff line
@@ -21,6 +21,11 @@ package com.android.systemui.onehanded;
 */
public interface OneHandedManager {

    /**
     * Set one handed enabled or disabled
     */
    default void setOneHandedEnabled(boolean enabled) {}

    /**
     * Exit one handed mode
     */
+21 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Context;
import androidx.annotation.NonNull;

import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.model.SysUiState;

import java.io.FileDescriptor;
@@ -36,6 +37,8 @@ import javax.inject.Singleton;
public class OneHandedManagerImpl implements OneHandedManager, Dumpable {
    private static final String TAG = "OneHandedManager";

    private boolean mIsOneHandedEnabled;
    private float mOffSetFraction;
    private OneHandedDisplayAreaOrganizer mDisplayAreaOrganizer;
    private SysUiState mSysUiFlagContainer;

@@ -49,6 +52,19 @@ public class OneHandedManagerImpl implements OneHandedManager, Dumpable {

        mDisplayAreaOrganizer = displayAreaOrganizer;
        mSysUiFlagContainer = sysUiState;
        mOffSetFraction =
                context.getResources().getFraction(R.fraction.config_one_handed_offset, 1, 1);
        mIsOneHandedEnabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
                context.getContentResolver());
        updateOneHandedEnabled();
    }

    /**
     * Set one handed enabled or disabled by OneHanded UI when user update settings
     */
    public void setOneHandedEnabled(boolean enabled) {
        mIsOneHandedEnabled = enabled;
        updateOneHandedEnabled();
    }

    /**
@@ -65,10 +81,15 @@ public class OneHandedManagerImpl implements OneHandedManager, Dumpable {
    public void stopOneHanded() {
    }

    private void updateOneHandedEnabled() {
    }

    @Override
    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
        final String innerPrefix = "  ";
        pw.println(TAG + "states: ");
        pw.print(innerPrefix + "mIsOneHandedEnabled=");
        pw.println(mIsOneHandedEnabled);

        if (mDisplayAreaOrganizer != null) {
            mDisplayAreaOrganizer.dump(fd, pw, args);
+145 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.onehanded;

import android.annotation.IntDef;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.provider.Settings;

import com.android.internal.annotations.VisibleForTesting;

import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Inject;
import javax.inject.Singleton;

/**
 * APIs for querying or updating one handed settings .
 */
@Singleton
public final class OneHandedSettingsUtil {
    private static final String TAG = "OneHandedSettingsUtil";

    @IntDef(prefix = {"ONE_HANDED_TIMEOUT_"}, value = {
            ONE_HANDED_TIMEOUT_NEVER,
            ONE_HANDED_TIMEOUT_SHORT_IN_SECONDS,
            ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS,
            ONE_HANDED_TIMEOUT_LONG_IN_SECONDS,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface OneHandedTimeout {
    }

    /**
     * Never stop one handed automatically
     */
    public static final int ONE_HANDED_TIMEOUT_NEVER = 0;
    /**
     * Auto stop one handed in {@link OneHandedSettingsUtil#ONE_HANDED_TIMEOUT_SHORT_IN_SECONDS}
     */
    public static final int ONE_HANDED_TIMEOUT_SHORT_IN_SECONDS = 4;
    /**
     * Auto stop one handed in {@link OneHandedSettingsUtil#ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS}
     */
    public static final int ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS = 8;
    /**
     * Auto stop one handed in {@link OneHandedSettingsUtil#ONE_HANDED_TIMEOUT_LONG_IN_SECONDS}
     */
    public static final int ONE_HANDED_TIMEOUT_LONG_IN_SECONDS = 12;

    @VisibleForTesting
    @Inject
    OneHandedSettingsUtil() {
    }

    /**
     * Register one handed preference settings observer
     *
     * @param key      Setting key to monitor in observer
     * @param resolver ContentResolver of context
     * @param observer Observer from caller
     * @return uri key for observing
     */
    public static Uri registerSettingsKeyObserver(String key, ContentResolver resolver,
            ContentObserver observer) {
        Uri uriKey = null;
        uriKey = Settings.Secure.getUriFor(key);
        if (resolver != null && uriKey != null) {
            resolver.registerContentObserver(uriKey, false, observer);
        }
        return uriKey;
    }

    /**
     * Unregister one handed preference settings observer
     *
     * @param resolver ContentResolver of context
     * @param observer preference key change observer
     */
    public static void unregisterSettingsKeyObserver(ContentResolver resolver,
            ContentObserver observer) {
        if (resolver != null) {
            resolver.unregisterContentObserver(observer);
        }
    }

    /**
     * Query one handed enable or disable flag from Settings provider.
     *
     * @return enable or disable one handed mode flag.
     */
    public static boolean getSettingsOneHandedModeEnabled(ContentResolver resolver) {
        return Settings.Secure.getInt(resolver,
                Settings.Secure.ONE_HANDED_MODE_ENABLED, 0 /* Disabled */) == 1;
    }

    /**
     * Query taps app to exit config from Settings provider.
     *
     * @return enable or disable taps app exit.
     */
    public static boolean getSettingsTapsAppToExit(ContentResolver resolver) {
        return Settings.Secure.getInt(resolver,
                Settings.Secure.TAPS_APP_TO_EXIT, 0) == 1;
    }

    /**
     * Query timeout value from Settings provider.
     * Default is {@link OneHandedSettingsUtil#ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS}
     *
     * @return timeout value in seconds.
     */
    public static @OneHandedTimeout int getSettingsOneHandedModeTimeout(ContentResolver resolver) {
        return Settings.Secure.getInt(resolver,
                Settings.Secure.ONE_HANDED_MODE_TIMEOUT, ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
    }

    protected static void dump(PrintWriter pw, String prefix, ContentResolver resolver) {
        final String innerPrefix = prefix + "  ";
        pw.println(prefix + TAG);
        pw.print(innerPrefix + "isOneHandedModeEnable=");
        pw.println(getSettingsOneHandedModeEnabled(resolver));
        pw.print(innerPrefix + "oneHandedTimeOut=");
        pw.println(getSettingsOneHandedModeTimeout(resolver));
        pw.print(innerPrefix + "tapsAppToExit=");
        pw.println(getSettingsTapsAppToExit(resolver));
    }
}
+60 −3
Original line number Diff line number Diff line
@@ -17,6 +17,10 @@
package com.android.systemui.onehanded;

import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;

import com.android.systemui.Dumpable;
import com.android.systemui.SystemUI;
@@ -36,14 +40,46 @@ import javax.inject.Singleton;
public class OneHandedUI extends SystemUI implements CommandQueue.Callbacks, Dumpable {
    private static final String TAG = "OneHandedUI";

    private final OneHandedManager mOneHandedManager;
    private final OneHandedManagerImpl mOneHandedManager;
    private final CommandQueue mCommandQueue;
    private final Handler mMainHandler = new Handler(Looper.getMainLooper());
    private final OneHandedSettingsUtil mSettingUtil;

    private final ContentObserver mEnabledObserver = new ContentObserver(mMainHandler) {
        @Override
        public void onChange(boolean selfChange) {
            // TODO (b/149366439) UIEvent metrics add here, user config timeout in settings
            if (mOneHandedManager != null) {
                final boolean enabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
                        mContext.getContentResolver());
                mOneHandedManager.setOneHandedEnabled(enabled);
            }
        }
    };

    private final ContentObserver mTimeoutObserver = new ContentObserver(mMainHandler) {
        @Override
        public void onChange(boolean selfChange) {
            // TODO (b/149366439) UIEvent metrics add here, user config timeout in settings
            final boolean enabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
                    mContext.getContentResolver());
            mOneHandedManager.setOneHandedEnabled(enabled);
        }
    };

    private final ContentObserver mTaskChangeExitObserver = new ContentObserver(mMainHandler) {
        @Override
        public void onChange(boolean selfChange) {
            // TODO (b/149366439) UIEvent metrics add here, user config tap app exit in settings
        }
    };

    @Inject
    public OneHandedUI(Context context,
            CommandQueue commandQueue,
            OneHandedManager oneHandedManager,
            DumpManager dumpManager) {
            OneHandedManagerImpl oneHandedManager,
            DumpManager dumpManager,
            OneHandedSettingsUtil settingsUtil) {
        super(context);

        mCommandQueue = commandQueue;
@@ -51,6 +87,7 @@ public class OneHandedUI extends SystemUI implements CommandQueue.Callbacks, Dum
            boolean supportOneHanded = SystemProperties.getBoolean("support_one_handed_mode");
            if (!supportOneHanded) return; */
        mOneHandedManager = oneHandedManager;
        mSettingUtil =  settingsUtil;
    }

    @Override
@@ -59,6 +96,22 @@ public class OneHandedUI extends SystemUI implements CommandQueue.Callbacks, Dum
            boolean supportOneHanded = SystemProperties.getBoolean("support_one_handed_mode");
            if (!supportOneHanded) return; */
        mCommandQueue.addCallback(this);
        setupSettingObservers();
        updateSettings();
    }

    private void setupSettingObservers() {
        mSettingUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_ENABLED,
                mContext.getContentResolver(), mEnabledObserver);
        mSettingUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_TIMEOUT,
                mContext.getContentResolver(), mTimeoutObserver);
        mSettingUtil.registerSettingsKeyObserver(Settings.Secure.TAPS_APP_TO_EXIT,
                mContext.getContentResolver(), mTaskChangeExitObserver);
    }

    private void updateSettings() {
        mOneHandedManager.setOneHandedEnabled(
                mSettingUtil.getSettingsOneHandedModeEnabled(mContext.getContentResolver()));
    }

    /**
@@ -87,5 +140,9 @@ public class OneHandedUI extends SystemUI implements CommandQueue.Callbacks, Dum
        if (mOneHandedManager != null) {
            ((OneHandedManagerImpl) mOneHandedManager).dump(fd, pw, args);
        }

        if (mSettingUtil != null) {
            mSettingUtil.dump(pw, innerPrefix, mContext.getContentResolver());
        }
    }
}
Loading