Merge "First commit for settings panels"
This commit is contained in:
committed by
Android (Google) Code Review
commit
71a255968f
@@ -2959,6 +2959,17 @@
|
|||||||
android:value="true" />
|
android:value="true" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity android:name=".panel.SettingsPanelActivity"
|
||||||
|
android:label="@string/settings_panel_title"
|
||||||
|
android:theme="@style/Theme.BottomDialog"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
|
android:launchMode="singleTask">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.settings.SETTINGSPANEL" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
<provider android:name=".slices.SettingsSliceProvider"
|
<provider android:name=".slices.SettingsSliceProvider"
|
||||||
android:authorities="com.android.settings.slices;android.settings.slices"
|
android:authorities="com.android.settings.slices;android.settings.slices"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
22
res/drawable/settings_panel_background.xml
Normal file
22
res/drawable/settings_panel_background.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2018 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<inset xmlns:android="http://schemas.android.com/apk/res/android" android:inset="4dp">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
<solid android:color="?android:attr/colorBackground" />
|
||||||
|
</shape>
|
||||||
|
</inset>
|
26
res/layout/panel_layout.xml
Normal file
26
res/layout/panel_layout.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright (C) 2018 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
|
||||||
|
-->
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/panel_parent_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="24dp"
|
||||||
|
android:paddingRight="24dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:layout_margin="4dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
</LinearLayout>
|
19
res/layout/settings_panel.xml
Normal file
19
res/layout/settings_panel.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2018 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.
|
||||||
|
-->
|
||||||
|
<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"/>
|
@@ -10299,8 +10299,8 @@
|
|||||||
<!-- Available networks screen, summary when button disallowed due to permanent automatic mode [CHAR LIMIT=NONE] -->
|
<!-- Available networks screen, summary when button disallowed due to permanent automatic mode [CHAR LIMIT=NONE] -->
|
||||||
<string name="manual_mode_disallowed_summary">Unavailable when connected to <xliff:g id="carrier" example="verizon">%1$s</xliff:g></string>
|
<string name="manual_mode_disallowed_summary">Unavailable when connected to <xliff:g id="carrier" example="verizon">%1$s</xliff:g></string>
|
||||||
|
|
||||||
<!-- Used for EmergencyInfoSlice slice helper class -->
|
<!-- Used for EmergencyInfoSlice slice helper class [CHAR LIMIT=NONE]-->
|
||||||
<string name="emergency_info_contextual_card_summary" translatable="false">Medical info, emergency contacts</string>
|
<string name="emergency_info_contextual_card_summary">Medical info, emergency contacts</string>
|
||||||
|
|
||||||
<!-- See more items in contextual homepage [CHAR LIMIT=30]-->
|
<!-- See more items in contextual homepage [CHAR LIMIT=30]-->
|
||||||
<string name="see_more">See more</string>
|
<string name="see_more">See more</string>
|
||||||
@@ -10322,6 +10322,12 @@
|
|||||||
<!-- Title for no connected devices in connected device slice. [CHAR LIMIT=NONE] -->
|
<!-- Title for no connected devices in connected device slice. [CHAR LIMIT=NONE] -->
|
||||||
<string name="no_connected_devices">No connected devices</string>
|
<string name="no_connected_devices">No connected devices</string>
|
||||||
|
|
||||||
|
<!-- Default title for the settings panel [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="settings_panel_title">Settings Panel</string>
|
||||||
|
|
||||||
|
<!-- Title for the Internet Connectivity dialog (settings panel) with Internet related settings [CHAR LIMIT=50] -->
|
||||||
|
<string name="internet_connectivity_panel_title">Internet Connectivity</string>
|
||||||
|
|
||||||
<!-- UI debug setting: force desktop mode [CHAR LIMIT=50] -->
|
<!-- UI debug setting: force desktop mode [CHAR LIMIT=50] -->
|
||||||
<string name="force_desktop_mode">Force desktop mode</string>
|
<string name="force_desktop_mode">Force desktop mode</string>
|
||||||
<!-- UI debug setting: force desktop mode summary [CHAR LIMIT=NONE] -->
|
<!-- UI debug setting: force desktop mode summary [CHAR LIMIT=NONE] -->
|
||||||
|
@@ -200,4 +200,8 @@
|
|||||||
<item name="cardBackgroundColor">?android:attr/colorBackground</item>
|
<item name="cardBackgroundColor">?android:attr/colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.BottomDialog" parent="@*android:style/Theme.DeviceDefault.Settings.Dialog">
|
||||||
|
<item name="android:windowBackground">@drawable/settings_panel_background</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -64,7 +64,7 @@
|
|||||||
settings:useAdminDisabledSummary="true" />
|
settings:useAdminDisabledSummary="true" />
|
||||||
|
|
||||||
<com.android.settingslib.RestrictedSwitchPreference
|
<com.android.settingslib.RestrictedSwitchPreference
|
||||||
android:key="toggle_airplane"
|
android:key="airplane_mode"
|
||||||
android:title="@string/airplane_mode"
|
android:title="@string/airplane_mode"
|
||||||
android:icon="@drawable/ic_airplanemode_active"
|
android:icon="@drawable/ic_airplanemode_active"
|
||||||
android:disableDependentsState="true"
|
android:disableDependentsState="true"
|
||||||
|
@@ -93,7 +93,7 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSliceable() {
|
public boolean isSliceable() {
|
||||||
return TextUtils.equals(getPreferenceKey(), "toggle_airplane");
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -29,6 +29,7 @@ import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
|||||||
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
||||||
import com.android.settings.gestures.AssistGestureFeatureProvider;
|
import com.android.settings.gestures.AssistGestureFeatureProvider;
|
||||||
import com.android.settings.localepicker.LocaleFeatureProvider;
|
import com.android.settings.localepicker.LocaleFeatureProvider;
|
||||||
|
import com.android.settings.panel.PanelFeatureProvider;
|
||||||
import com.android.settings.search.SearchFeatureProvider;
|
import com.android.settings.search.SearchFeatureProvider;
|
||||||
import com.android.settings.security.SecurityFeatureProvider;
|
import com.android.settings.security.SecurityFeatureProvider;
|
||||||
import com.android.settings.slices.SlicesFeatureProvider;
|
import com.android.settings.slices.SlicesFeatureProvider;
|
||||||
@@ -105,6 +106,8 @@ public abstract class FeatureFactory {
|
|||||||
|
|
||||||
public abstract AccountFeatureProvider getAccountFeatureProvider();
|
public abstract AccountFeatureProvider getAccountFeatureProvider();
|
||||||
|
|
||||||
|
public abstract PanelFeatureProvider getPanelFeatureProvider();
|
||||||
|
|
||||||
public static final class FactoryNotFoundException extends RuntimeException {
|
public static final class FactoryNotFoundException extends RuntimeException {
|
||||||
public FactoryNotFoundException(Throwable throwable) {
|
public FactoryNotFoundException(Throwable throwable) {
|
||||||
super("Unable to create factory. Did you misconfigure Proguard?", throwable);
|
super("Unable to create factory. Did you misconfigure Proguard?", throwable);
|
||||||
|
@@ -42,6 +42,8 @@ import com.android.settings.gestures.AssistGestureFeatureProvider;
|
|||||||
import com.android.settings.gestures.AssistGestureFeatureProviderImpl;
|
import com.android.settings.gestures.AssistGestureFeatureProviderImpl;
|
||||||
import com.android.settings.localepicker.LocaleFeatureProvider;
|
import com.android.settings.localepicker.LocaleFeatureProvider;
|
||||||
import com.android.settings.localepicker.LocaleFeatureProviderImpl;
|
import com.android.settings.localepicker.LocaleFeatureProviderImpl;
|
||||||
|
import com.android.settings.panel.PanelFeatureProvider;
|
||||||
|
import com.android.settings.panel.PanelFeatureProviderImpl;
|
||||||
import com.android.settings.search.SearchFeatureProvider;
|
import com.android.settings.search.SearchFeatureProvider;
|
||||||
import com.android.settings.search.SearchFeatureProviderImpl;
|
import com.android.settings.search.SearchFeatureProviderImpl;
|
||||||
import com.android.settings.security.SecurityFeatureProvider;
|
import com.android.settings.security.SecurityFeatureProvider;
|
||||||
@@ -72,6 +74,7 @@ public class FeatureFactoryImpl extends FeatureFactory {
|
|||||||
private UserFeatureProvider mUserFeatureProvider;
|
private UserFeatureProvider mUserFeatureProvider;
|
||||||
private SlicesFeatureProvider mSlicesFeatureProvider;
|
private SlicesFeatureProvider mSlicesFeatureProvider;
|
||||||
private AccountFeatureProvider mAccountFeatureProvider;
|
private AccountFeatureProvider mAccountFeatureProvider;
|
||||||
|
private PanelFeatureProvider mPanelFeatureProvider;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SupportFeatureProvider getSupportFeatureProvider(Context context) {
|
public SupportFeatureProvider getSupportFeatureProvider(Context context) {
|
||||||
@@ -209,4 +212,12 @@ public class FeatureFactoryImpl extends FeatureFactory {
|
|||||||
}
|
}
|
||||||
return mAccountFeatureProvider;
|
return mAccountFeatureProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PanelFeatureProvider getPanelFeatureProvider() {
|
||||||
|
if (mPanelFeatureProvider == null) {
|
||||||
|
mPanelFeatureProvider = new PanelFeatureProviderImpl();
|
||||||
|
}
|
||||||
|
return mPanelFeatureProvider;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.provider.SettingsSlicesContract;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.wifi.WifiSlice;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the Internet Connectivity Panel.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Displays Wifi (full Slice) and Airplane mode.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public class InternetConnectivityPanel implements PanelContent {
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
static final Uri AIRPLANE_URI = new Uri.Builder()
|
||||||
|
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||||
|
.authority(SettingsSlicesContract.AUTHORITY)
|
||||||
|
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
|
||||||
|
.appendPath(SettingsSlicesContract.KEY_AIRPLANE_MODE)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
|
public static InternetConnectivityPanel create(Context context) {
|
||||||
|
return new InternetConnectivityPanel(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private InternetConnectivityPanel(Context context) {
|
||||||
|
mContext = context.getApplicationContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTitle() {
|
||||||
|
return (String) mContext.getText(R.string.internet_connectivity_panel_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Uri> getSlices() {
|
||||||
|
final List<Uri> uris = new ArrayList<>();
|
||||||
|
uris.add(WifiSlice.WIFI_URI);
|
||||||
|
uris.add(AIRPLANE_URI);
|
||||||
|
return uris;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Intent getSeeMoreIntent() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
49
src/com/android/settings/panel/PanelContent.java
Normal file
49
src/com/android/settings/panel/PanelContent.java
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the data class needed to create a Settings Panel. See {@link PanelFragment}.
|
||||||
|
*/
|
||||||
|
public interface PanelContent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a string for the title of the Panel.
|
||||||
|
*/
|
||||||
|
CharSequence getTitle();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an ordered list of the Slices to be displayed in the Panel. The first item in the
|
||||||
|
* list is shown on top of the Panel.
|
||||||
|
*/
|
||||||
|
List<Uri> getSlices();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an {@link Intent} to the full content in Settings that is summarized by the Panel.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For example, for the connectivity panel you would intent to the Network & Internet page.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
Intent getSeeMoreIntent();
|
||||||
|
}
|
27
src/com/android/settings/panel/PanelFeatureProvider.java
Normal file
27
src/com/android/settings/panel/PanelFeatureProvider.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
public interface PanelFeatureProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@link PanelContent} as specified by the {@param panelType}.
|
||||||
|
*/
|
||||||
|
PanelContent getPanel(Context context, String panelType);
|
||||||
|
}
|
32
src/com/android/settings/panel/PanelFeatureProviderImpl.java
Normal file
32
src/com/android/settings/panel/PanelFeatureProviderImpl.java
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
public class PanelFeatureProviderImpl implements PanelFeatureProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PanelContent getPanel(Context context, String panelType) {
|
||||||
|
switch (panelType) {
|
||||||
|
case SettingsPanelActivity.PANEL_TYPE_WIFI:
|
||||||
|
return InternetConnectivityPanel.create(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalStateException("No matching panel for: " + panelType);
|
||||||
|
}
|
||||||
|
}
|
88
src/com/android/settings/panel/PanelFragment.java
Normal file
88
src/com/android/settings/panel/PanelFragment.java
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData;
|
||||||
|
import androidx.slice.Slice;
|
||||||
|
import androidx.slice.widget.SliceLiveData;
|
||||||
|
import androidx.slice.widget.SliceView;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class PanelFragment extends Fragment {
|
||||||
|
|
||||||
|
private static final String TAG = "PanelFragment";
|
||||||
|
|
||||||
|
private List<SliceView> mSliceViewList;
|
||||||
|
private List<LiveData<Slice>> mSliceDataList;
|
||||||
|
private LinearLayout mPanelLayout;
|
||||||
|
|
||||||
|
public PanelFragment() {
|
||||||
|
mSliceViewList = new ArrayList<>();
|
||||||
|
mSliceDataList = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||||
|
@Nullable Bundle savedInstanceState) {
|
||||||
|
final FragmentActivity activity = getActivity();
|
||||||
|
final View view = inflater.inflate(R.layout.panel_layout, container, false);
|
||||||
|
|
||||||
|
mPanelLayout = view.findViewById(R.id.panel_parent_layout);
|
||||||
|
final Bundle arguments = getArguments();
|
||||||
|
|
||||||
|
final String panelType = arguments.getString(SettingsPanelActivity.KEY_PANEL_TYPE_ARGUMENT);
|
||||||
|
|
||||||
|
final PanelContent panel = FeatureFactory.getFactory(activity)
|
||||||
|
.getPanelFeatureProvider()
|
||||||
|
.getPanel(activity, panelType);
|
||||||
|
|
||||||
|
activity.setTitle(panel.getTitle());
|
||||||
|
|
||||||
|
|
||||||
|
for (Uri uri : panel.getSlices()) {
|
||||||
|
final SliceView sliceView = new SliceView(activity);
|
||||||
|
mPanelLayout.addView(sliceView);
|
||||||
|
final LiveData<Slice> liveData = SliceLiveData.fromUri(activity, uri);
|
||||||
|
liveData.observe(this /* lifecycleOwner */, sliceView);
|
||||||
|
|
||||||
|
mSliceDataList.add(liveData);
|
||||||
|
mSliceViewList.add(sliceView);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
}
|
103
src/com/android/settings/panel/SettingsPanelActivity.java
Normal file
103
src/com/android/settings/panel/SettingsPanelActivity.java
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.Window;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog Activity to host Settings Slices.
|
||||||
|
*
|
||||||
|
* TODO link to action / framework API
|
||||||
|
*/
|
||||||
|
public class SettingsPanelActivity extends FragmentActivity {
|
||||||
|
|
||||||
|
private final String TAG = "panel_activity";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key specifying which Panel the app is requesting.
|
||||||
|
*/
|
||||||
|
public static final String KEY_PANEL_TYPE_ARGUMENT = "PANEL_TYPE_ARGUMENT";
|
||||||
|
|
||||||
|
|
||||||
|
// TODO (b/117804442) move to framework
|
||||||
|
public static final String EXTRA_PANEL_TYPE = "com.android.settings.panel.extra";
|
||||||
|
|
||||||
|
// TODO (b/117804442) move to framework
|
||||||
|
public static final String PANEL_TYPE_WIFI = "wifi_panel";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
final ComponentName callingActivityName = getCallingActivity();
|
||||||
|
|
||||||
|
if (callingActivityName == null) {
|
||||||
|
Log.e(TAG, "Must start with startActivityForResult. Closing.");
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Intent callingIntent = getIntent();
|
||||||
|
if (callingIntent == null) {
|
||||||
|
Log.e(TAG, "Null intent, closing Panel Activity");
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String typeExtra = callingIntent.getStringExtra(EXTRA_PANEL_TYPE);
|
||||||
|
if (TextUtils.isEmpty(typeExtra)) {
|
||||||
|
Log.e(TAG, "No intent passed, closing Panel Activity");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setContentView(R.layout.settings_panel);
|
||||||
|
|
||||||
|
// Move the window to the bottom of screen, and make it take up the entire screen width.
|
||||||
|
final Window window = getWindow();
|
||||||
|
window.setGravity(Gravity.BOTTOM);
|
||||||
|
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
|
||||||
|
WindowManager.LayoutParams.WRAP_CONTENT);
|
||||||
|
|
||||||
|
|
||||||
|
final Bundle bundle = new Bundle();
|
||||||
|
bundle.putString(KEY_PANEL_TYPE_ARGUMENT, typeExtra);
|
||||||
|
|
||||||
|
final PanelFragment panelFragment = new PanelFragment();
|
||||||
|
panelFragment.setArguments(bundle);
|
||||||
|
|
||||||
|
final FragmentManager fragmentManager = getSupportFragmentManager();
|
||||||
|
final Fragment fragment = fragmentManager.findFragmentById(R.id.main_content);
|
||||||
|
if (fragment == null) {
|
||||||
|
fragmentManager.beginTransaction().add(R.id.main_content, panelFragment).commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -427,7 +427,7 @@ public class SettingsSliceProvider extends SliceProvider {
|
|||||||
try {
|
try {
|
||||||
sliceData = mSlicesDatabaseAccessor.getSliceDataFromUri(uri);
|
sliceData = mSlicesDatabaseAccessor.getSliceDataFromUri(uri);
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
Log.d(TAG, "Could not create slicedata for uri: " + uri);
|
Log.d(TAG, "Could not create slicedata for uri: " + uri, e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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;
|
package com.android.settings.slices;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@@ -7,3 +7,4 @@ com.android.settings.RestrictedListPreference$RestrictedListPreferenceDialogFrag
|
|||||||
com.android.settings.password.ConfirmDeviceCredentialBaseFragment$LastTryDialog
|
com.android.settings.password.ConfirmDeviceCredentialBaseFragment$LastTryDialog
|
||||||
com.android.settings.password.CredentialCheckResultTracker
|
com.android.settings.password.CredentialCheckResultTracker
|
||||||
com.android.settings.dashboard.profileselector.ProfileSelectDialog
|
com.android.settings.dashboard.profileselector.ProfileSelectDialog
|
||||||
|
com.android.settings.panel.PanelFragment
|
@@ -187,11 +187,4 @@ public class AirplaneModePreferenceControllerTest {
|
|||||||
new AirplaneModePreferenceController(mContext,"toggle_airplane");
|
new AirplaneModePreferenceController(mContext,"toggle_airplane");
|
||||||
assertThat(controller.isSliceable()).isTrue();
|
assertThat(controller.isSliceable()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void isSliceableIncorrectKey_returnsFalse() {
|
|
||||||
final AirplaneModePreferenceController controller =
|
|
||||||
new AirplaneModePreferenceController(mContext, "bad_key");
|
|
||||||
assertThat(controller.isSliceable()).isFalse();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.wifi.WifiSlice;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
|
||||||
|
public class InternetConnectivityPanelTest {
|
||||||
|
|
||||||
|
private InternetConnectivityPanel mPanel;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
mPanel = InternetConnectivityPanel.create(RuntimeEnvironment.application);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSlices_containsNecessarySlices() {
|
||||||
|
final List<Uri> uris = mPanel.getSlices();
|
||||||
|
|
||||||
|
assertThat(uris).containsExactly(WifiSlice.WIFI_URI,
|
||||||
|
InternetConnectivityPanel.AIRPLANE_URI);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.panel;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
public class PanelFeatureProviderImplTest {
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private PanelFeatureProviderImpl mProvider;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
|
mProvider = new PanelFeatureProviderImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPanel_internetConnectivityKey_returnsCorrectPanel() {
|
||||||
|
final PanelContent panel = mProvider.getPanel(mContext,
|
||||||
|
SettingsPanelActivity.PANEL_TYPE_WIFI);
|
||||||
|
|
||||||
|
assertThat(panel).isInstanceOf(InternetConnectivityPanel.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -33,6 +33,7 @@ import com.android.settings.overlay.DockUpdaterFeatureProvider;
|
|||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.overlay.SupportFeatureProvider;
|
import com.android.settings.overlay.SupportFeatureProvider;
|
||||||
import com.android.settings.overlay.SurveyFeatureProvider;
|
import com.android.settings.overlay.SurveyFeatureProvider;
|
||||||
|
import com.android.settings.panel.PanelFeatureProvider;
|
||||||
import com.android.settings.search.SearchFeatureProvider;
|
import com.android.settings.search.SearchFeatureProvider;
|
||||||
import com.android.settings.security.SecurityFeatureProvider;
|
import com.android.settings.security.SecurityFeatureProvider;
|
||||||
import com.android.settings.slices.SlicesFeatureProvider;
|
import com.android.settings.slices.SlicesFeatureProvider;
|
||||||
@@ -61,6 +62,7 @@ public class FakeFeatureFactory extends FeatureFactory {
|
|||||||
public final UserFeatureProvider userFeatureProvider;
|
public final UserFeatureProvider userFeatureProvider;
|
||||||
public final AssistGestureFeatureProvider assistGestureFeatureProvider;
|
public final AssistGestureFeatureProvider assistGestureFeatureProvider;
|
||||||
public final AccountFeatureProvider mAccountFeatureProvider;
|
public final AccountFeatureProvider mAccountFeatureProvider;
|
||||||
|
public final PanelFeatureProvider mPanelFeatureProvider;
|
||||||
|
|
||||||
public SlicesFeatureProvider slicesFeatureProvider;
|
public SlicesFeatureProvider slicesFeatureProvider;
|
||||||
public SearchFeatureProvider searchFeatureProvider;
|
public SearchFeatureProvider searchFeatureProvider;
|
||||||
@@ -102,6 +104,7 @@ public class FakeFeatureFactory extends FeatureFactory {
|
|||||||
assistGestureFeatureProvider = mock(AssistGestureFeatureProvider.class);
|
assistGestureFeatureProvider = mock(AssistGestureFeatureProvider.class);
|
||||||
slicesFeatureProvider = mock(SlicesFeatureProvider.class);
|
slicesFeatureProvider = mock(SlicesFeatureProvider.class);
|
||||||
mAccountFeatureProvider = mock(AccountFeatureProvider.class);
|
mAccountFeatureProvider = mock(AccountFeatureProvider.class);
|
||||||
|
mPanelFeatureProvider = mock(PanelFeatureProvider.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -183,4 +186,9 @@ public class FakeFeatureFactory extends FeatureFactory {
|
|||||||
public AccountFeatureProvider getAccountFeatureProvider() {
|
public AccountFeatureProvider getAccountFeatureProvider() {
|
||||||
return mAccountFeatureProvider;
|
return mAccountFeatureProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PanelFeatureProvider getPanelFeatureProvider() {
|
||||||
|
return mPanelFeatureProvider;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user