Loading src/com/android/settings/core/BasePreferenceController.java +9 −40 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,6 @@ package com.android.settings.core; import android.annotation.IntDef; import android.annotation.IntDef; import android.content.Context; import android.content.Context; import android.content.IntentFilter; import android.text.TextUtils; import android.text.TextUtils; import android.util.Log; import android.util.Log; Loading @@ -24,6 +23,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw; import com.android.settings.slices.SliceData; import com.android.settings.slices.SliceData; import com.android.settings.slices.Sliceable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import java.lang.annotation.Retention; import java.lang.annotation.Retention; Loading @@ -37,7 +37,8 @@ import java.util.List; * for Slices. The abstract classes that inherit from this class will act as the direct interfaces * for Slices. The abstract classes that inherit from this class will act as the direct interfaces * for each type when plugging into Slices. * for each type when plugging into Slices. */ */ public abstract class BasePreferenceController extends AbstractPreferenceController { public abstract class BasePreferenceController extends AbstractPreferenceController implements Sliceable { private static final String TAG = "SettingsPrefController"; private static final String TAG = "SettingsPrefController"; Loading Loading @@ -226,41 +227,6 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl return SliceData.SliceType.INTENT; return SliceData.SliceType.INTENT; } } /** * @return an {@link IntentFilter} that includes all broadcasts which can affect the state of * this Setting. */ public IntentFilter getIntentFilter() { return null; } /** * Determines if the controller should be used as a Slice. * <p> * Important criteria for a Slice are: * - Must be secure * - Must not be a privacy leak * - Must be understandable as a stand-alone Setting. * <p> * This does not guarantee the setting is available. {@link #isAvailable()} should sill be * called. * * @return {@code true} if the controller should be used externally as a Slice. */ public boolean isSliceable() { return false; } /** * @return {@code true} if the setting update asynchronously. * <p> * For example, a Wifi controller would return true, because it needs to update the radio * and wait for it to turn on. */ public boolean hasAsyncUpdate() { return false; } /** /** * Updates non-indexable keys for search provider. * Updates non-indexable keys for search provider. * * Loading Loading @@ -293,6 +259,7 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl /** /** * Set {@link UiBlockListener} * Set {@link UiBlockListener} * * @param uiBlockListener listener to set * @param uiBlockListener listener to set */ */ public void setUiBlockListener(UiBlockListener uiBlockListener) { public void setUiBlockListener(UiBlockListener uiBlockListener) { Loading @@ -306,6 +273,7 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl /** /** * To notify client that UI related background work is finished. * To notify client that UI related background work is finished. * (i.e. Slice is fully loaded.) * (i.e. Slice is fully loaded.) * * @param controller Controller that contains background work * @param controller Controller that contains background work */ */ void onBlockerWorkFinished(BasePreferenceController controller); void onBlockerWorkFinished(BasePreferenceController controller); Loading @@ -321,5 +289,6 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl * * * This music be used in {@link BasePreferenceController} * This music be used in {@link BasePreferenceController} */ */ public interface UiBlocker {} public interface UiBlocker { } } } No newline at end of file src/com/android/settings/slices/CustomSliceable.java +6 −13 Original line number Original line Diff line number Diff line Loading @@ -52,7 +52,7 @@ import java.lang.reflect.InvocationTargetException; * <p> * <p> * If you implement this interface, you should add your Slice to {@link CustomSliceManager}. * If you implement this interface, you should add your Slice to {@link CustomSliceManager}. */ */ public interface CustomSliceable { public interface CustomSliceable extends Sliceable { /** /** * @return an complete instance of the {@link Slice}. * @return an complete instance of the {@link Slice}. Loading @@ -78,17 +78,6 @@ public interface CustomSliceable { */ */ Intent getIntent(); Intent getIntent(); /** * Settings Slices which can represent components that are updatable by the framework should * listen to changes matched to the {@link IntentFilter} returned here. * * @return an {@link IntentFilter} for updates related to the {@link Slice} returned by * {@link #getSlice()}. */ default IntentFilter getIntentFilter() { return null; } /** /** * Settings Slices which require background work, such as updating lists should implement a * Settings Slices which require background work, such as updating lists should implement a * {@link SliceBackgroundWorker} and return it here. An example of background work is updating * {@link SliceBackgroundWorker} and return it here. An example of background work is updating Loading Loading @@ -116,12 +105,16 @@ public interface CustomSliceable { PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent.FLAG_CANCEL_CURRENT); } } @Override default boolean isSliceable() { return true; } /** /** * Build an instance of a {@link CustomSliceable} which has a {@link Context}-only constructor. * Build an instance of a {@link CustomSliceable} which has a {@link Context}-only constructor. */ */ static CustomSliceable createInstance(Context context, Class<CustomSliceable> sliceableClass) { static CustomSliceable createInstance(Context context, Class<CustomSliceable> sliceableClass) { try { try { //final Class<CustomSliceable> clazz = Class.forName(sliceableClassName); final Constructor<CustomSliceable> sliceable = final Constructor<CustomSliceable> sliceable = sliceableClass.getConstructor(Context.class); sliceableClass.getConstructor(Context.class); final Object[] params = new Object[]{context}; final Object[] params = new Object[]{context}; Loading src/com/android/settings/slices/SettingsSliceProvider.java +1 −3 Original line number Original line Diff line number Diff line Loading @@ -411,9 +411,7 @@ public class SettingsSliceProvider extends SliceProvider { @VisibleForTesting @VisibleForTesting void loadSliceInBackground(Uri uri) { void loadSliceInBackground(Uri uri) { ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> loadSlice(uri)); loadSlice(uri); }); } } /** /** Loading src/com/android/settings/slices/Sliceable.java 0 → 100644 +58 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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.settings.slices; import android.content.IntentFilter; /** * A collection of API making a PreferenceController "sliceable" */ public interface Sliceable { /** * @return an {@link IntentFilter} that includes all broadcasts which can affect the state of * this Setting. */ default IntentFilter getIntentFilter() { return null; } /** * Determines if the controller should be used as a Slice. * <p> * Important criteria for a Slice are: * - Must be secure * - Must not be a privacy leak * - Must be understandable as a stand-alone Setting. * <p> * This does not guarantee the setting is available. * * @return {@code true} if the controller should be used externally as a Slice. */ default boolean isSliceable() { return false; } /** * @return {@code true} if the setting update asynchronously. * <p> * For example, a Wifi controller would return true, because it needs to update the radio * and wait for it to turn on. */ default boolean hasAsyncUpdate() { return false; } } Loading
src/com/android/settings/core/BasePreferenceController.java +9 −40 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,6 @@ package com.android.settings.core; import android.annotation.IntDef; import android.annotation.IntDef; import android.content.Context; import android.content.Context; import android.content.IntentFilter; import android.text.TextUtils; import android.text.TextUtils; import android.util.Log; import android.util.Log; Loading @@ -24,6 +23,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw; import com.android.settings.slices.SliceData; import com.android.settings.slices.SliceData; import com.android.settings.slices.Sliceable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import java.lang.annotation.Retention; import java.lang.annotation.Retention; Loading @@ -37,7 +37,8 @@ import java.util.List; * for Slices. The abstract classes that inherit from this class will act as the direct interfaces * for Slices. The abstract classes that inherit from this class will act as the direct interfaces * for each type when plugging into Slices. * for each type when plugging into Slices. */ */ public abstract class BasePreferenceController extends AbstractPreferenceController { public abstract class BasePreferenceController extends AbstractPreferenceController implements Sliceable { private static final String TAG = "SettingsPrefController"; private static final String TAG = "SettingsPrefController"; Loading Loading @@ -226,41 +227,6 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl return SliceData.SliceType.INTENT; return SliceData.SliceType.INTENT; } } /** * @return an {@link IntentFilter} that includes all broadcasts which can affect the state of * this Setting. */ public IntentFilter getIntentFilter() { return null; } /** * Determines if the controller should be used as a Slice. * <p> * Important criteria for a Slice are: * - Must be secure * - Must not be a privacy leak * - Must be understandable as a stand-alone Setting. * <p> * This does not guarantee the setting is available. {@link #isAvailable()} should sill be * called. * * @return {@code true} if the controller should be used externally as a Slice. */ public boolean isSliceable() { return false; } /** * @return {@code true} if the setting update asynchronously. * <p> * For example, a Wifi controller would return true, because it needs to update the radio * and wait for it to turn on. */ public boolean hasAsyncUpdate() { return false; } /** /** * Updates non-indexable keys for search provider. * Updates non-indexable keys for search provider. * * Loading Loading @@ -293,6 +259,7 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl /** /** * Set {@link UiBlockListener} * Set {@link UiBlockListener} * * @param uiBlockListener listener to set * @param uiBlockListener listener to set */ */ public void setUiBlockListener(UiBlockListener uiBlockListener) { public void setUiBlockListener(UiBlockListener uiBlockListener) { Loading @@ -306,6 +273,7 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl /** /** * To notify client that UI related background work is finished. * To notify client that UI related background work is finished. * (i.e. Slice is fully loaded.) * (i.e. Slice is fully loaded.) * * @param controller Controller that contains background work * @param controller Controller that contains background work */ */ void onBlockerWorkFinished(BasePreferenceController controller); void onBlockerWorkFinished(BasePreferenceController controller); Loading @@ -321,5 +289,6 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl * * * This music be used in {@link BasePreferenceController} * This music be used in {@link BasePreferenceController} */ */ public interface UiBlocker {} public interface UiBlocker { } } } No newline at end of file
src/com/android/settings/slices/CustomSliceable.java +6 −13 Original line number Original line Diff line number Diff line Loading @@ -52,7 +52,7 @@ import java.lang.reflect.InvocationTargetException; * <p> * <p> * If you implement this interface, you should add your Slice to {@link CustomSliceManager}. * If you implement this interface, you should add your Slice to {@link CustomSliceManager}. */ */ public interface CustomSliceable { public interface CustomSliceable extends Sliceable { /** /** * @return an complete instance of the {@link Slice}. * @return an complete instance of the {@link Slice}. Loading @@ -78,17 +78,6 @@ public interface CustomSliceable { */ */ Intent getIntent(); Intent getIntent(); /** * Settings Slices which can represent components that are updatable by the framework should * listen to changes matched to the {@link IntentFilter} returned here. * * @return an {@link IntentFilter} for updates related to the {@link Slice} returned by * {@link #getSlice()}. */ default IntentFilter getIntentFilter() { return null; } /** /** * Settings Slices which require background work, such as updating lists should implement a * Settings Slices which require background work, such as updating lists should implement a * {@link SliceBackgroundWorker} and return it here. An example of background work is updating * {@link SliceBackgroundWorker} and return it here. An example of background work is updating Loading Loading @@ -116,12 +105,16 @@ public interface CustomSliceable { PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent.FLAG_CANCEL_CURRENT); } } @Override default boolean isSliceable() { return true; } /** /** * Build an instance of a {@link CustomSliceable} which has a {@link Context}-only constructor. * Build an instance of a {@link CustomSliceable} which has a {@link Context}-only constructor. */ */ static CustomSliceable createInstance(Context context, Class<CustomSliceable> sliceableClass) { static CustomSliceable createInstance(Context context, Class<CustomSliceable> sliceableClass) { try { try { //final Class<CustomSliceable> clazz = Class.forName(sliceableClassName); final Constructor<CustomSliceable> sliceable = final Constructor<CustomSliceable> sliceable = sliceableClass.getConstructor(Context.class); sliceableClass.getConstructor(Context.class); final Object[] params = new Object[]{context}; final Object[] params = new Object[]{context}; Loading
src/com/android/settings/slices/SettingsSliceProvider.java +1 −3 Original line number Original line Diff line number Diff line Loading @@ -411,9 +411,7 @@ public class SettingsSliceProvider extends SliceProvider { @VisibleForTesting @VisibleForTesting void loadSliceInBackground(Uri uri) { void loadSliceInBackground(Uri uri) { ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> loadSlice(uri)); loadSlice(uri); }); } } /** /** Loading
src/com/android/settings/slices/Sliceable.java 0 → 100644 +58 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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.settings.slices; import android.content.IntentFilter; /** * A collection of API making a PreferenceController "sliceable" */ public interface Sliceable { /** * @return an {@link IntentFilter} that includes all broadcasts which can affect the state of * this Setting. */ default IntentFilter getIntentFilter() { return null; } /** * Determines if the controller should be used as a Slice. * <p> * Important criteria for a Slice are: * - Must be secure * - Must not be a privacy leak * - Must be understandable as a stand-alone Setting. * <p> * This does not guarantee the setting is available. * * @return {@code true} if the controller should be used externally as a Slice. */ default boolean isSliceable() { return false; } /** * @return {@code true} if the setting update asynchronously. * <p> * For example, a Wifi controller would return true, because it needs to update the radio * and wait for it to turn on. */ default boolean hasAsyncUpdate() { return false; } }