Loading res/layout/settings_panel.xml +2 −1 Original line number Diff line number Diff line Loading @@ -16,4 +16,5 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_content" android:layout_height="match_parent" android:layout_width="match_parent"/> No newline at end of file android:layout_width="match_parent" android:animateLayoutChanges="true"/> No newline at end of file src/com/android/settings/nfc/NfcPreferenceController.java +86 −11 Original line number Diff line number Diff line Loading @@ -15,20 +15,26 @@ */ package com.android.settings.nfc; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.nfc.NfcAdapter; import android.provider.Settings; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import com.android.settings.core.TogglePreferenceController; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; import java.io.IOException; public class NfcPreferenceController extends TogglePreferenceController implements LifecycleObserver, OnResume, OnPause { Loading @@ -51,8 +57,7 @@ public class NfcPreferenceController extends TogglePreferenceController return; } final SwitchPreference switchPreference = (SwitchPreference) screen.findPreference(getPreferenceKey()); final SwitchPreference switchPreference = screen.findPreference(getPreferenceKey()); mNfcEnabler = new NfcEnabler(mContext, switchPreference); Loading Loading @@ -86,14 +91,6 @@ public class NfcPreferenceController extends TogglePreferenceController : UNSUPPORTED_ON_DEVICE; } @Override public IntentFilter getIntentFilter() { final IntentFilter filter = new IntentFilter(); filter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); filter.addAction(NfcAdapter.EXTRA_ADAPTER_STATE); return filter; } @Override public boolean hasAsyncUpdate() { return true; Loading @@ -104,6 +101,11 @@ public class NfcPreferenceController extends TogglePreferenceController return true; } @Override public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() { return NfcSliceWorker.class; } @Override public void onResume() { if (mAirplaneModeObserver != null) { Loading Loading @@ -135,4 +137,77 @@ public class NfcPreferenceController extends TogglePreferenceController Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); return toggleable != null && toggleable.contains(Settings.Global.RADIO_NFC); } /** * Listener for background changes to NFC. * * <p> * Listen to broadcasts from {@link NfcAdapter}. The worker will call notify changed on the * NFC Slice only when the following extras are present in the broadcast: * <ul> * <li>{@link NfcAdapter#STATE_ON}</li> * <li>{@link NfcAdapter#STATE_OFF}</li> * </ul> */ public static class NfcSliceWorker extends SliceBackgroundWorker<Void> { private static final String TAG = "NfcSliceWorker"; private static final IntentFilter NFC_FILTER = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); private NfcUpdateReceiver mUpdateObserver; public NfcSliceWorker(Context context, Uri uri) { super(context, uri); mUpdateObserver = new NfcUpdateReceiver(this); } @Override protected void onSlicePinned() { getContext().registerReceiver(mUpdateObserver, NFC_FILTER); } @Override protected void onSliceUnpinned() { getContext().unregisterReceiver(mUpdateObserver); } @Override public void close() throws IOException { mUpdateObserver = null; } public void updateSlice() { notifySliceChange(); } public class NfcUpdateReceiver extends BroadcastReceiver { private final int NO_EXTRA = -1; private final NfcSliceWorker mSliceBackgroundWorker; public NfcUpdateReceiver(NfcSliceWorker sliceWorker) { mSliceBackgroundWorker = sliceWorker; } @Override public void onReceive(Context context, Intent intent) { final int nfcStateExtra = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NO_EXTRA); // Do nothing if state change is empty, or an intermediate step. if ( (nfcStateExtra == NO_EXTRA) || (nfcStateExtra == NfcAdapter.STATE_TURNING_ON) || (nfcStateExtra == NfcAdapter.STATE_TURNING_OFF)) { Log.d(TAG, "Transitional update, dropping broadcast"); return; } Log.d(TAG, "Nfc broadcast received, updating Slice."); mSliceBackgroundWorker.updateSlice(); } } } } src/com/android/settings/slices/CustomSliceable.java +0 −12 Original line number Diff line number Diff line Loading @@ -83,18 +83,6 @@ public interface CustomSliceable extends Sliceable { */ Intent getIntent(); /** * 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 * a list of Wifi networks available in the area. * * @return a {@link Class<? extends SliceBackgroundWorker>} to perform background work for the * slice. */ default Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() { return null; } /** * Standardize the intents returned to indicate actions by the Slice. * <p> Loading src/com/android/settings/slices/SettingsSliceProvider.java +5 −4 Original line number Diff line number Diff line Loading @@ -153,7 +153,7 @@ public class SettingsSliceProvider extends SliceProvider { if (filter != null) { registerIntentToUri(filter, sliceUri); } ThreadUtils.postOnMainThread(() -> startBackgroundWorker(sliceable)); ThreadUtils.postOnMainThread(() -> startBackgroundWorker(sliceable, sliceUri)); return; } Loading Loading @@ -326,20 +326,19 @@ public class SettingsSliceProvider extends SliceProvider { } } private void startBackgroundWorker(CustomSliceable sliceable) { private void startBackgroundWorker(Sliceable sliceable, Uri uri) { final Class workerClass = sliceable.getBackgroundWorkerClass(); if (workerClass == null) { return; } final Uri uri = sliceable.getUri(); if (mPinnedWorkers.containsKey(uri)) { return; } Log.d(TAG, "Starting background worker for: " + uri); final SliceBackgroundWorker worker = SliceBackgroundWorker.getInstance( getContext(), sliceable); getContext(), sliceable, uri); mPinnedWorkers.put(uri, worker); worker.onSlicePinned(); } Loading Loading @@ -397,6 +396,8 @@ public class SettingsSliceProvider extends SliceProvider { registerIntentToUri(filter, uri); } ThreadUtils.postOnMainThread(() -> startBackgroundWorker(controller, uri)); final List<Uri> pinnedSlices = getContext().getSystemService( SliceManager.class).getPinnedSlices(); if (pinnedSlices.contains(uri)) { Loading src/com/android/settings/slices/SliceBackgroundWorker.java +2 −3 Original line number Diff line number Diff line Loading @@ -80,13 +80,12 @@ public abstract class SliceBackgroundWorker<E> implements Closeable { * Returns the singleton instance of the {@link SliceBackgroundWorker} for specified {@link * CustomSliceable} */ static SliceBackgroundWorker getInstance(Context context, CustomSliceable sliceable) { final Uri uri = sliceable.getUri(); static SliceBackgroundWorker getInstance(Context context, Sliceable sliceable, Uri uri) { SliceBackgroundWorker worker = getInstance(uri); if (worker == null) { final Class<? extends SliceBackgroundWorker> workerClass = sliceable.getBackgroundWorkerClass(); worker = createInstance(context, uri, workerClass); worker = createInstance(context.getApplicationContext(), uri, workerClass); LIVE_WORKERS.put(uri, worker); } return worker; Loading Loading
res/layout/settings_panel.xml +2 −1 Original line number Diff line number Diff line Loading @@ -16,4 +16,5 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_content" android:layout_height="match_parent" android:layout_width="match_parent"/> No newline at end of file android:layout_width="match_parent" android:animateLayoutChanges="true"/> No newline at end of file
src/com/android/settings/nfc/NfcPreferenceController.java +86 −11 Original line number Diff line number Diff line Loading @@ -15,20 +15,26 @@ */ package com.android.settings.nfc; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.nfc.NfcAdapter; import android.provider.Settings; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import com.android.settings.core.TogglePreferenceController; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; import java.io.IOException; public class NfcPreferenceController extends TogglePreferenceController implements LifecycleObserver, OnResume, OnPause { Loading @@ -51,8 +57,7 @@ public class NfcPreferenceController extends TogglePreferenceController return; } final SwitchPreference switchPreference = (SwitchPreference) screen.findPreference(getPreferenceKey()); final SwitchPreference switchPreference = screen.findPreference(getPreferenceKey()); mNfcEnabler = new NfcEnabler(mContext, switchPreference); Loading Loading @@ -86,14 +91,6 @@ public class NfcPreferenceController extends TogglePreferenceController : UNSUPPORTED_ON_DEVICE; } @Override public IntentFilter getIntentFilter() { final IntentFilter filter = new IntentFilter(); filter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); filter.addAction(NfcAdapter.EXTRA_ADAPTER_STATE); return filter; } @Override public boolean hasAsyncUpdate() { return true; Loading @@ -104,6 +101,11 @@ public class NfcPreferenceController extends TogglePreferenceController return true; } @Override public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() { return NfcSliceWorker.class; } @Override public void onResume() { if (mAirplaneModeObserver != null) { Loading Loading @@ -135,4 +137,77 @@ public class NfcPreferenceController extends TogglePreferenceController Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); return toggleable != null && toggleable.contains(Settings.Global.RADIO_NFC); } /** * Listener for background changes to NFC. * * <p> * Listen to broadcasts from {@link NfcAdapter}. The worker will call notify changed on the * NFC Slice only when the following extras are present in the broadcast: * <ul> * <li>{@link NfcAdapter#STATE_ON}</li> * <li>{@link NfcAdapter#STATE_OFF}</li> * </ul> */ public static class NfcSliceWorker extends SliceBackgroundWorker<Void> { private static final String TAG = "NfcSliceWorker"; private static final IntentFilter NFC_FILTER = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); private NfcUpdateReceiver mUpdateObserver; public NfcSliceWorker(Context context, Uri uri) { super(context, uri); mUpdateObserver = new NfcUpdateReceiver(this); } @Override protected void onSlicePinned() { getContext().registerReceiver(mUpdateObserver, NFC_FILTER); } @Override protected void onSliceUnpinned() { getContext().unregisterReceiver(mUpdateObserver); } @Override public void close() throws IOException { mUpdateObserver = null; } public void updateSlice() { notifySliceChange(); } public class NfcUpdateReceiver extends BroadcastReceiver { private final int NO_EXTRA = -1; private final NfcSliceWorker mSliceBackgroundWorker; public NfcUpdateReceiver(NfcSliceWorker sliceWorker) { mSliceBackgroundWorker = sliceWorker; } @Override public void onReceive(Context context, Intent intent) { final int nfcStateExtra = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NO_EXTRA); // Do nothing if state change is empty, or an intermediate step. if ( (nfcStateExtra == NO_EXTRA) || (nfcStateExtra == NfcAdapter.STATE_TURNING_ON) || (nfcStateExtra == NfcAdapter.STATE_TURNING_OFF)) { Log.d(TAG, "Transitional update, dropping broadcast"); return; } Log.d(TAG, "Nfc broadcast received, updating Slice."); mSliceBackgroundWorker.updateSlice(); } } } }
src/com/android/settings/slices/CustomSliceable.java +0 −12 Original line number Diff line number Diff line Loading @@ -83,18 +83,6 @@ public interface CustomSliceable extends Sliceable { */ Intent getIntent(); /** * 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 * a list of Wifi networks available in the area. * * @return a {@link Class<? extends SliceBackgroundWorker>} to perform background work for the * slice. */ default Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() { return null; } /** * Standardize the intents returned to indicate actions by the Slice. * <p> Loading
src/com/android/settings/slices/SettingsSliceProvider.java +5 −4 Original line number Diff line number Diff line Loading @@ -153,7 +153,7 @@ public class SettingsSliceProvider extends SliceProvider { if (filter != null) { registerIntentToUri(filter, sliceUri); } ThreadUtils.postOnMainThread(() -> startBackgroundWorker(sliceable)); ThreadUtils.postOnMainThread(() -> startBackgroundWorker(sliceable, sliceUri)); return; } Loading Loading @@ -326,20 +326,19 @@ public class SettingsSliceProvider extends SliceProvider { } } private void startBackgroundWorker(CustomSliceable sliceable) { private void startBackgroundWorker(Sliceable sliceable, Uri uri) { final Class workerClass = sliceable.getBackgroundWorkerClass(); if (workerClass == null) { return; } final Uri uri = sliceable.getUri(); if (mPinnedWorkers.containsKey(uri)) { return; } Log.d(TAG, "Starting background worker for: " + uri); final SliceBackgroundWorker worker = SliceBackgroundWorker.getInstance( getContext(), sliceable); getContext(), sliceable, uri); mPinnedWorkers.put(uri, worker); worker.onSlicePinned(); } Loading Loading @@ -397,6 +396,8 @@ public class SettingsSliceProvider extends SliceProvider { registerIntentToUri(filter, uri); } ThreadUtils.postOnMainThread(() -> startBackgroundWorker(controller, uri)); final List<Uri> pinnedSlices = getContext().getSystemService( SliceManager.class).getPinnedSlices(); if (pinnedSlices.contains(uri)) { Loading
src/com/android/settings/slices/SliceBackgroundWorker.java +2 −3 Original line number Diff line number Diff line Loading @@ -80,13 +80,12 @@ public abstract class SliceBackgroundWorker<E> implements Closeable { * Returns the singleton instance of the {@link SliceBackgroundWorker} for specified {@link * CustomSliceable} */ static SliceBackgroundWorker getInstance(Context context, CustomSliceable sliceable) { final Uri uri = sliceable.getUri(); static SliceBackgroundWorker getInstance(Context context, Sliceable sliceable, Uri uri) { SliceBackgroundWorker worker = getInstance(uri); if (worker == null) { final Class<? extends SliceBackgroundWorker> workerClass = sliceable.getBackgroundWorkerClass(); worker = createInstance(context, uri, workerClass); worker = createInstance(context.getApplicationContext(), uri, workerClass); LIVE_WORKERS.put(uri, worker); } return worker; Loading