Add PendingIntent to SharedConnectivitySettingsState

Bug: 272521649
Test: atest SharedConnectivitySettingsStateTest
Change-Id: I825435476b230d835455078aa3a58f50461eae88
This commit is contained in:
Isaac Katzenelson
2023-03-13 06:52:10 +00:00
parent 4e5d10b1d1
commit f90e340576
7 changed files with 98 additions and 29 deletions

View File

@@ -10141,16 +10141,18 @@ package android.net.wifi.sharedconnectivity.app {
public final class SharedConnectivitySettingsState implements android.os.Parcelable {
method public int describeContents();
method @NonNull public android.os.Bundle getExtras();
method @Nullable public android.app.PendingIntent getInstantTetherSettingsPendingIntent();
method public boolean isInstantTetherEnabled();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState> CREATOR;
}
public static final class SharedConnectivitySettingsState.Builder {
ctor public SharedConnectivitySettingsState.Builder();
ctor public SharedConnectivitySettingsState.Builder(@NonNull android.content.Context);
method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState build();
method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setExtras(@NonNull android.os.Bundle);
method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setInstantTetherEnabled(boolean);
method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setInstantTetherSettingsPendingIntent(@NonNull android.content.Intent);
}
}

View File

@@ -17,7 +17,11 @@
package android.net.wifi.sharedconnectivity.app;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -37,6 +41,7 @@ import java.util.Objects;
public final class SharedConnectivitySettingsState implements Parcelable {
private final boolean mInstantTetherEnabled;
private final PendingIntent mInstantTetherSettingsPendingIntent;
private final Bundle mExtras;
/**
@@ -44,9 +49,13 @@ public final class SharedConnectivitySettingsState implements Parcelable {
*/
public static final class Builder {
private boolean mInstantTetherEnabled;
private Intent mInstantTetherSettingsIntent;
private final Context mContext;
private Bundle mExtras;
public Builder() {}
public Builder(@NonNull Context context) {
mContext = context;
}
/**
* Sets the state of Instant Tether in settings
@@ -59,6 +68,20 @@ public final class SharedConnectivitySettingsState implements Parcelable {
return this;
}
/**
* Sets the intent that will open the Instant Tether settings page.
* The intent will be stored as a {@link PendingIntent} in the settings object. The pending
* intent will be set as {@link PendingIntent#FLAG_IMMUTABLE} and
* {@link PendingIntent#FLAG_ONE_SHOT}.
*
* @return Returns the Builder object.
*/
@NonNull
public Builder setInstantTetherSettingsPendingIntent(@NonNull Intent intent) {
mInstantTetherSettingsIntent = intent;
return this;
}
/**
* Sets the extras bundle
*
@@ -77,12 +100,22 @@ public final class SharedConnectivitySettingsState implements Parcelable {
*/
@NonNull
public SharedConnectivitySettingsState build() {
return new SharedConnectivitySettingsState(mInstantTetherEnabled, mExtras);
if (mInstantTetherSettingsIntent != null) {
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
mInstantTetherSettingsIntent,
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
return new SharedConnectivitySettingsState(mInstantTetherEnabled,
pendingIntent, mExtras);
}
return new SharedConnectivitySettingsState(mInstantTetherEnabled, null, mExtras);
}
}
private SharedConnectivitySettingsState(boolean instantTetherEnabled, Bundle extras) {
private SharedConnectivitySettingsState(boolean instantTetherEnabled,
PendingIntent pendingIntent, Bundle extras) {
mInstantTetherEnabled = instantTetherEnabled;
mInstantTetherSettingsPendingIntent = pendingIntent;
mExtras = extras;
}
@@ -95,6 +128,16 @@ public final class SharedConnectivitySettingsState implements Parcelable {
return mInstantTetherEnabled;
}
/**
* Gets the pending intent to open Instant Tether settings page.
*
* @return Returns the pending intent that opens the settings page, null if none.
*/
@Nullable
public PendingIntent getInstantTetherSettingsPendingIntent() {
return mInstantTetherSettingsPendingIntent;
}
/**
* Gets the extras Bundle.
*
@@ -109,12 +152,14 @@ public final class SharedConnectivitySettingsState implements Parcelable {
public boolean equals(Object obj) {
if (!(obj instanceof SharedConnectivitySettingsState)) return false;
SharedConnectivitySettingsState other = (SharedConnectivitySettingsState) obj;
return mInstantTetherEnabled == other.isInstantTetherEnabled();
return mInstantTetherEnabled == other.isInstantTetherEnabled()
&& Objects.equals(mInstantTetherSettingsPendingIntent,
other.getInstantTetherSettingsPendingIntent());
}
@Override
public int hashCode() {
return Objects.hash(mInstantTetherEnabled);
return Objects.hash(mInstantTetherEnabled, mInstantTetherSettingsPendingIntent);
}
@Override
@@ -124,6 +169,7 @@ public final class SharedConnectivitySettingsState implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
mInstantTetherSettingsPendingIntent.writeToParcel(dest, 0);
dest.writeBoolean(mInstantTetherEnabled);
dest.writeBundle(mExtras);
}
@@ -135,8 +181,10 @@ public final class SharedConnectivitySettingsState implements Parcelable {
*/
@NonNull
public static SharedConnectivitySettingsState readFromParcel(@NonNull Parcel in) {
return new SharedConnectivitySettingsState(in.readBoolean(),
in.readBundle());
PendingIntent pendingIntent = PendingIntent.CREATOR.createFromParcel(in);
boolean instantTetherEnabled = in.readBoolean();
Bundle extras = in.readBundle();
return new SharedConnectivitySettingsState(instantTetherEnabled, pendingIntent, extras);
}
@NonNull
@@ -156,6 +204,7 @@ public final class SharedConnectivitySettingsState implements Parcelable {
public String toString() {
return new StringBuilder("SharedConnectivitySettingsState[")
.append("instantTetherEnabled=").append(mInstantTetherEnabled)
.append("PendingIntent=").append(mInstantTetherSettingsPendingIntent.toString())
.append("extras=").append(mExtras.toString())
.append("]").toString();
}

View File

@@ -68,9 +68,7 @@ public abstract class SharedConnectivityService extends Service {
new RemoteCallbackList<>();
private List<HotspotNetwork> mHotspotNetworks = Collections.emptyList();
private List<KnownNetwork> mKnownNetworks = Collections.emptyList();
private SharedConnectivitySettingsState mSettingsState =
new SharedConnectivitySettingsState.Builder().setInstantTetherEnabled(false)
.setExtras(Bundle.EMPTY).build();
private SharedConnectivitySettingsState mSettingsState = null;
private HotspotNetworkConnectionStatus mHotspotNetworkConnectionStatus =
new HotspotNetworkConnectionStatus.Builder()
.setStatus(HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN)
@@ -202,6 +200,13 @@ public abstract class SharedConnectivityService extends Service {
@Override
public SharedConnectivitySettingsState getSettingsState() {
checkPermissions();
// Done lazily since creating it needs a context.
if (mSettingsState == null) {
mSettingsState = new SharedConnectivitySettingsState
.Builder(getApplicationContext())
.setInstantTetherEnabled(false)
.setExtras(Bundle.EMPTY).build();
}
return mSettingsState;
}

View File

@@ -36,6 +36,7 @@ android_test {
static_libs: [
"androidx.test.rules",
"androidx.test.core",
"frameworks-base-testutils",
"guava",
"mockito-target-minus-junit4",

View File

@@ -497,8 +497,9 @@ public class SharedConnectivityManagerTest {
@Test
public void getSettingsState_serviceConnected_shouldReturnState() throws RemoteException {
SharedConnectivityManager manager = SharedConnectivityManager.create(mContext);
SharedConnectivitySettingsState state = new SharedConnectivitySettingsState.Builder()
.setInstantTetherEnabled(true).setExtras(new Bundle()).build();
SharedConnectivitySettingsState state =
new SharedConnectivitySettingsState.Builder(mContext).setInstantTetherEnabled(true)
.setExtras(new Bundle()).build();
manager.setService(mService);
when(mService.getSettingsState()).thenReturn(state);

View File

@@ -18,8 +18,10 @@ package android.net.wifi.sharedconnectivity.app;
import static com.google.common.truth.Truth.assertThat;
import android.content.Intent;
import android.os.Parcel;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -30,8 +32,12 @@ import org.junit.Test;
@SmallTest
public class SharedConnectivitySettingsStateTest {
private static final boolean INSTANT_TETHER_STATE = true;
private static final String INTENT_ACTION = "instant.tether.settings";
private static final boolean INSTANT_TETHER_STATE_1 = false;
private static final String INTENT_ACTION_1 = "instant.tether.settings1";
/**
* Verifies parcel serialization/deserialization.
*/
@@ -39,16 +45,11 @@ public class SharedConnectivitySettingsStateTest {
public void testParcelOperation() {
SharedConnectivitySettingsState state = buildSettingsStateBuilder().build();
Parcel parcelW = Parcel.obtain();
state.writeToParcel(parcelW, 0);
byte[] bytes = parcelW.marshall();
parcelW.recycle();
Parcel parcelR = Parcel.obtain();
parcelR.unmarshall(bytes, 0, bytes.length);
parcelR.setDataPosition(0);
Parcel parcel = Parcel.obtain();
state.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
SharedConnectivitySettingsState fromParcel =
SharedConnectivitySettingsState.CREATOR.createFromParcel(parcelR);
SharedConnectivitySettingsState.CREATOR.createFromParcel(parcel);
assertThat(fromParcel).isEqualTo(state);
assertThat(fromParcel.hashCode()).isEqualTo(state.hashCode());
@@ -66,6 +67,10 @@ public class SharedConnectivitySettingsStateTest {
SharedConnectivitySettingsState.Builder builder = buildSettingsStateBuilder()
.setInstantTetherEnabled(INSTANT_TETHER_STATE_1);
assertThat(builder.build()).isNotEqualTo(state1);
builder = buildSettingsStateBuilder()
.setInstantTetherSettingsPendingIntent(new Intent(INTENT_ACTION_1));
assertThat(builder.build()).isNotEqualTo(state1);
}
/**
@@ -86,7 +91,9 @@ public class SharedConnectivitySettingsStateTest {
}
private SharedConnectivitySettingsState.Builder buildSettingsStateBuilder() {
return new SharedConnectivitySettingsState.Builder()
.setInstantTetherEnabled(INSTANT_TETHER_STATE);
return new SharedConnectivitySettingsState.Builder(
ApplicationProvider.getApplicationContext())
.setInstantTetherEnabled(INSTANT_TETHER_STATE)
.setInstantTetherSettingsPendingIntent(new Intent(INTENT_ACTION));
}
}

View File

@@ -75,9 +75,6 @@ public class SharedConnectivityServiceTest {
.addSecurityType(SECURITY_TYPE_EAP).setNetworkProviderInfo(
NETWORK_PROVIDER_INFO).build();
private static final List<KnownNetwork> KNOWN_NETWORKS = List.of(KNOWN_NETWORK);
private static final SharedConnectivitySettingsState SETTINGS_STATE =
new SharedConnectivitySettingsState.Builder().setInstantTetherEnabled(true)
.setExtras(Bundle.EMPTY).build();
private static final HotspotNetworkConnectionStatus TETHER_NETWORK_CONNECTION_STATUS =
new HotspotNetworkConnectionStatus.Builder().setStatus(CONNECTION_STATUS_UNKNOWN)
.setHotspotNetwork(HOTSPOT_NETWORK).setExtras(Bundle.EMPTY).build();
@@ -155,10 +152,11 @@ public class SharedConnectivityServiceTest {
SharedConnectivityService service = createService();
ISharedConnectivityService.Stub binder =
(ISharedConnectivityService.Stub) service.onBind(new Intent());
when(mContext.getPackageName()).thenReturn("android.net.wifi.nonupdatable.test");
service.setSettingsState(SETTINGS_STATE);
service.setSettingsState(buildSettingsState());
assertThat(binder.getSettingsState()).isEqualTo(SETTINGS_STATE);
assertThat(binder.getSettingsState()).isEqualTo(buildSettingsState());
}
@Test
@@ -232,4 +230,10 @@ public class SharedConnectivityServiceTest {
service.attachBaseContext(mContext);
return service;
}
private SharedConnectivitySettingsState buildSettingsState() {
return new SharedConnectivitySettingsState.Builder(mContext).setInstantTetherEnabled(true)
.setInstantTetherSettingsPendingIntent(new Intent())
.setExtras(Bundle.EMPTY).build();
}
}