Add activity for mobile network page
1. Extract the Tabhost to activity level, not fragment level. So each mobile fragment has a constant subscriptionId 2. Use BottomNavigationView instead of TabHost Bug: 114749736 Test: RunSettingsRoboTests Change-Id: I43aebf2ec01a945697c6b2302ab750e715e4bfef
This commit is contained in:
@@ -131,6 +131,13 @@
|
|||||||
android:launchMode="singleTask">
|
android:launchMode="singleTask">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity android:name=".mobilenetwork.MobileSettingsActivity"
|
||||||
|
android:label="@string/network_settings_title"
|
||||||
|
android:theme="@style/Theme.Settings.Home"
|
||||||
|
android:launchMode="singleTask">
|
||||||
|
<!-- TODO(b/114749736): add intent filter here and disable the one in telephony -->
|
||||||
|
</activity>
|
||||||
|
|
||||||
<!-- Alias for launcher activity only, as this belongs to each profile. -->
|
<!-- Alias for launcher activity only, as this belongs to each profile. -->
|
||||||
<activity-alias android:name="Settings"
|
<activity-alias android:name="Settings"
|
||||||
android:taskAffinity="com.android.settings.root"
|
android:taskAffinity="com.android.settings.root"
|
||||||
|
50
res/layout/mobile_settings_container.xml
Normal file
50
res/layout/mobile_settings_container.xml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?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"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<Toolbar
|
||||||
|
android:id="@+id/action_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:navigationContentDescription="@*android:string/action_bar_up_description"
|
||||||
|
android:theme="?android:attr/actionBarTheme"
|
||||||
|
style="?android:attr/actionBarStyle"/>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/main_content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
|
||||||
|
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
|
android:id="@+id/bottom_nav"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_marginEnd="0dp"
|
||||||
|
android:layout_marginStart="0dp"
|
||||||
|
android:background="?android:attr/windowBackground"
|
||||||
|
app:itemIconTint="@color/bottom_navigation_colors"
|
||||||
|
app:itemTextColor="@color/bottom_navigation_colors"
|
||||||
|
app:menu="@menu/home_bottom_navigation"/>
|
||||||
|
</LinearLayout>
|
@@ -33,14 +33,4 @@ public class AdvancedOptionsPreference extends Preference {
|
|||||||
public AdvancedOptionsPreference(Context context, AttributeSet attrs) {
|
public AdvancedOptionsPreference(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
|
||||||
super.onBindViewHolder(holder);
|
|
||||||
|
|
||||||
setIcon(R.drawable.ic_expand_more);
|
|
||||||
setTitle(R.string.advanced_options_title);
|
|
||||||
TextView summary = (TextView) holder.findViewById(android.R.id.summary);
|
|
||||||
summary.setMaxLines(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
@@ -46,11 +46,7 @@ import android.telephony.TelephonyManager;
|
|||||||
import android.telephony.euicc.EuiccManager;
|
import android.telephony.euicc.EuiccManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.TabHost;
|
|
||||||
|
|
||||||
import com.android.ims.ImsConfig;
|
import com.android.ims.ImsConfig;
|
||||||
import com.android.ims.ImsManager;
|
import com.android.ims.ImsManager;
|
||||||
@@ -67,7 +63,6 @@ import com.android.settingslib.RestrictedLockUtilsInternal;
|
|||||||
import com.android.settingslib.RestrictedSwitchPreference;
|
import com.android.settingslib.RestrictedSwitchPreference;
|
||||||
import com.android.settingslib.search.SearchIndexable;
|
import com.android.settingslib.search.SearchIndexable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -174,9 +169,6 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
private boolean mOkClicked;
|
private boolean mOkClicked;
|
||||||
private boolean mExpandAdvancedFields;
|
private boolean mExpandAdvancedFields;
|
||||||
|
|
||||||
// We assume the the value returned by mTabHost.getCurrentTab() == slotId
|
|
||||||
private TabHost mTabHost;
|
|
||||||
|
|
||||||
//GsmUmts options and Cdma options
|
//GsmUmts options and Cdma options
|
||||||
GsmUmtsOptions mGsmUmtsOptions;
|
GsmUmtsOptions mGsmUmtsOptions;
|
||||||
CdmaOptions mCdmaOptions;
|
CdmaOptions mCdmaOptions;
|
||||||
@@ -226,13 +218,6 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
private final PhoneCallStateListener
|
private final PhoneCallStateListener
|
||||||
mPhoneStateListener = new PhoneCallStateListener();
|
mPhoneStateListener = new PhoneCallStateListener();
|
||||||
|
|
||||||
//TODO(b/114749736): figure out a way to update this fragment from intent
|
|
||||||
public void onIntentUpdate(Intent intent) {
|
|
||||||
if (!mUnavailable) {
|
|
||||||
updateCurrentTab(intent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
//TODO(b/114749736): add metrics id for it
|
//TODO(b/114749736): add metrics id for it
|
||||||
@@ -356,78 +341,7 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
// Process preferences in activity only if its not destroyed
|
// Process preferences in activity only if its not destroyed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int currentTab = 0;
|
updatePhone();
|
||||||
if (DBG) log("initializeSubscriptions:+");
|
|
||||||
|
|
||||||
// Before updating the the active subscription list check
|
|
||||||
// if tab updating is needed as the list is changing.
|
|
||||||
List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
|
|
||||||
TabState state = isUpdateTabsNeeded(sil);
|
|
||||||
|
|
||||||
// Update to the active subscription list
|
|
||||||
mActiveSubInfos.clear();
|
|
||||||
if (sil != null) {
|
|
||||||
mActiveSubInfos.addAll(sil);
|
|
||||||
// If there is only 1 sim then currenTab should represent slot no. of the sim.
|
|
||||||
if (sil.size() == 1) {
|
|
||||||
currentTab = sil.get(0).getSimSlotIndex();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case UPDATE: {
|
|
||||||
if (DBG) log("initializeSubscriptions: UPDATE");
|
|
||||||
currentTab = mTabHost != null ? mTabHost.getCurrentTab() : 0;
|
|
||||||
|
|
||||||
mTabHost = (TabHost) getActivity().findViewById(android.R.id.tabhost);
|
|
||||||
mTabHost.setup();
|
|
||||||
|
|
||||||
// Update the tabName. Since the mActiveSubInfos are in slot order
|
|
||||||
// we can iterate though the tabs and subscription info in one loop. But
|
|
||||||
// we need to handle the case where a slot may be empty.
|
|
||||||
|
|
||||||
Iterator<SubscriptionInfo> siIterator = mActiveSubInfos.listIterator();
|
|
||||||
SubscriptionInfo si = siIterator.hasNext() ? siIterator.next() : null;
|
|
||||||
for (int simSlotIndex = 0; simSlotIndex < mActiveSubInfos.size();
|
|
||||||
simSlotIndex++) {
|
|
||||||
String tabName;
|
|
||||||
if (si != null && si.getSimSlotIndex() == simSlotIndex) {
|
|
||||||
// Slot is not empty and we match
|
|
||||||
tabName = String.valueOf(si.getDisplayName());
|
|
||||||
si = siIterator.hasNext() ? siIterator.next() : null;
|
|
||||||
} else {
|
|
||||||
// Slot is empty, set name to unknown
|
|
||||||
tabName = getResources().getString(R.string.unknown);
|
|
||||||
}
|
|
||||||
if (DBG) {
|
|
||||||
log("initializeSubscriptions:tab=" + simSlotIndex + " name=" + tabName);
|
|
||||||
}
|
|
||||||
|
|
||||||
mTabHost.addTab(buildTabSpec(String.valueOf(simSlotIndex), tabName));
|
|
||||||
}
|
|
||||||
|
|
||||||
mTabHost.setOnTabChangedListener(mTabListener);
|
|
||||||
mTabHost.setCurrentTab(currentTab);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case NO_TABS: {
|
|
||||||
if (DBG) log("initializeSubscriptions: NO_TABS");
|
|
||||||
|
|
||||||
if (mTabHost != null) {
|
|
||||||
mTabHost.clearAllTabs();
|
|
||||||
mTabHost = null;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DO_NOTHING: {
|
|
||||||
if (DBG) log("initializeSubscriptions: DO_NOTHING");
|
|
||||||
if (mTabHost != null) {
|
|
||||||
currentTab = mTabHost.getCurrentTab();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
updatePhone(currentTab);
|
|
||||||
updateBody();
|
updateBody();
|
||||||
if (DBG) log("initializeSubscriptions:-");
|
if (DBG) log("initializeSubscriptions:-");
|
||||||
}
|
}
|
||||||
@@ -465,60 +379,16 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TabHost.OnTabChangeListener mTabListener = new TabHost.OnTabChangeListener() {
|
private void updatePhone() {
|
||||||
@Override
|
if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
|
||||||
public void onTabChanged(String tabId) {
|
|
||||||
if (DBG) log("onTabChanged:");
|
|
||||||
// The User has changed tab; update the body.
|
|
||||||
updatePhone(Integer.parseInt(tabId));
|
|
||||||
updateBody();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private void updatePhone(int slotId) {
|
|
||||||
final SubscriptionInfo sir = mSubscriptionManager
|
|
||||||
.getActiveSubscriptionInfoForSimSlotIndex(slotId);
|
|
||||||
|
|
||||||
if (sir != null) {
|
|
||||||
mSubId = sir.getSubscriptionId();
|
|
||||||
|
|
||||||
Log.i(LOG_TAG, "updatePhone:- slotId=" + slotId + " sir=" + sir);
|
|
||||||
|
|
||||||
mImsMgr = ImsManager.getInstance(getContext(),
|
mImsMgr = ImsManager.getInstance(getContext(),
|
||||||
SubscriptionManager.getPhoneId(mSubId));
|
SubscriptionManager.getPhoneId(mSubId));
|
||||||
mTelephonyManager = new TelephonyManager(getContext(), mSubId);
|
mTelephonyManager = new TelephonyManager(getContext(), mSubId);
|
||||||
if (mImsMgr == null) {
|
|
||||||
log("updatePhone :: Could not get ImsManager instance!");
|
|
||||||
} else if (DBG) {
|
|
||||||
log("updatePhone :: mImsMgr=" + mImsMgr);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// There is no active subscription in the given slot.
|
|
||||||
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mPhoneStateListener.updateSubscriptionId(mSubId);
|
mPhoneStateListener.updateSubscriptionId(mSubId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TabHost.TabContentFactory mEmptyTabContent = new TabHost.TabContentFactory() {
|
|
||||||
@Override
|
|
||||||
public View createTabContent(String tag) {
|
|
||||||
return new View(mTabHost.getContext());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private TabHost.TabSpec buildTabSpec(String tag, String title) {
|
|
||||||
return mTabHost.newTabSpec(tag).setIndicator(title).setContent(
|
|
||||||
mEmptyTabContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateCurrentTab(Intent intent) {
|
|
||||||
int slotId = getSlotIdFromIntent(intent);
|
|
||||||
if (slotId >= 0 && mTabHost != null && mTabHost.getCurrentTab() != slotId) {
|
|
||||||
mTabHost.setCurrentTab(slotId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSaveInstanceState(Bundle outState) {
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
@@ -591,23 +461,17 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
|
|
||||||
// Initialize mActiveSubInfo
|
// Initialize mActiveSubInfo
|
||||||
int max = mSubscriptionManager.getActiveSubscriptionInfoCountMax();
|
int max = mSubscriptionManager.getActiveSubscriptionInfoCountMax();
|
||||||
mActiveSubInfos = new ArrayList<SubscriptionInfo>(max);
|
mActiveSubInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
|
||||||
|
mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID,
|
||||||
|
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
|
||||||
|
|
||||||
int currentTab = mTabHost != null ? mTabHost.getCurrentTab() : 0;
|
updatePhone();
|
||||||
updatePhone(currentTab);
|
|
||||||
if (hasActiveSubscriptions()) {
|
if (hasActiveSubscriptions()) {
|
||||||
updateEnabledNetworksEntries();
|
updateEnabledNetworksEntries();
|
||||||
}
|
}
|
||||||
Log.i(LOG_TAG, "onCreate:-");
|
Log.i(LOG_TAG, "onCreate:-");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
return inflater.inflate(com.android.internal.R.layout.common_tab_settings,
|
|
||||||
container, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
@@ -617,7 +481,6 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
//TODO(b/114749736): migrate telephony_disallowed_preference_screen.xml
|
//TODO(b/114749736): migrate telephony_disallowed_preference_screen.xml
|
||||||
} else {
|
} else {
|
||||||
initializeSubscriptions();
|
initializeSubscriptions();
|
||||||
updateCurrentTab(getActivity().getIntent());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -714,7 +577,7 @@ public class MobileNetworkFragment extends DashboardFragment implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasActiveSubscriptions() {
|
private boolean hasActiveSubscriptions() {
|
||||||
return mActiveSubInfos.size() > 0;
|
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateBodyBasicFields(FragmentActivity activity, PreferenceScreen prefSet,
|
private void updateBodyBasicFields(FragmentActivity activity, PreferenceScreen prefSet,
|
||||||
|
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* 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.mobilenetwork;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.telephony.SubscriptionInfo;
|
||||||
|
import android.telephony.SubscriptionManager;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.android.internal.util.CollectionUtils;
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
|
|
||||||
|
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
|
public class MobileSettingsActivity extends SettingsBaseActivity {
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
static final String MOBILE_SETTINGS_TAG = "mobile_settings:";
|
||||||
|
public static final String KEY_SUBSCRIPTION_ID = "key_subscription_id";
|
||||||
|
|
||||||
|
private SubscriptionManager mSubscriptionManager;
|
||||||
|
@VisibleForTesting
|
||||||
|
int mPrevSubscriptionId;
|
||||||
|
@VisibleForTesting
|
||||||
|
List<SubscriptionInfo> mSubscriptionInfos;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onNewIntent(Intent intent) {
|
||||||
|
super.onNewIntent(intent);
|
||||||
|
//TODO(b/114749736): update fragment by new intent, or at least make sure this page shows
|
||||||
|
// current tab for sim card
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
mSubscriptionManager = getSystemService(SubscriptionManager.class);
|
||||||
|
mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
|
||||||
|
mPrevSubscriptionId = CollectionUtils.isEmpty(mSubscriptionInfos)
|
||||||
|
? SubscriptionManager.INVALID_SUBSCRIPTION_ID
|
||||||
|
: mSubscriptionInfos.get(0).getSubscriptionId();
|
||||||
|
|
||||||
|
setContentView(R.layout.mobile_settings_container);
|
||||||
|
|
||||||
|
updateBottomNavigationView();
|
||||||
|
|
||||||
|
if (savedInstanceState == null) {
|
||||||
|
switchFragment(new MobileNetworkFragment(), mPrevSubscriptionId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void updateBottomNavigationView() {
|
||||||
|
final BottomNavigationView navigation = findViewById(R.id.bottom_nav);
|
||||||
|
|
||||||
|
if (CollectionUtils.size(mSubscriptionInfos) <= 1) {
|
||||||
|
navigation.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
final Menu menu = navigation.getMenu();
|
||||||
|
menu.clear();
|
||||||
|
for (int i = 0, size = mSubscriptionInfos.size(); i < size; i++) {
|
||||||
|
final SubscriptionInfo subscriptionInfo = mSubscriptionInfos.get(i);
|
||||||
|
menu.add(0, subscriptionInfo.getSubscriptionId(), i,
|
||||||
|
subscriptionInfo.getDisplayName());
|
||||||
|
}
|
||||||
|
navigation.setOnNavigationItemSelectedListener(item -> {
|
||||||
|
switchFragment(new MobileNetworkFragment(), item.getItemId());
|
||||||
|
mPrevSubscriptionId = item.getItemId();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void switchFragment(Fragment fragment, int subscriptionId) {
|
||||||
|
final FragmentManager fragmentManager = getSupportFragmentManager();
|
||||||
|
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
|
||||||
|
final Bundle bundle = new Bundle();
|
||||||
|
bundle.putInt(KEY_SUBSCRIPTION_ID, subscriptionId);
|
||||||
|
|
||||||
|
final Fragment hideFragment = fragmentManager.findFragmentByTag(
|
||||||
|
buildFragmentTag(mPrevSubscriptionId));
|
||||||
|
if (hideFragment != null) {
|
||||||
|
fragmentTransaction.hide(hideFragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
Fragment showFragment = fragmentManager.findFragmentByTag(buildFragmentTag(subscriptionId));
|
||||||
|
if (showFragment == null) {
|
||||||
|
fragment.setArguments(bundle);
|
||||||
|
fragmentTransaction.add(R.id.main_content, fragment, buildFragmentTag(subscriptionId));
|
||||||
|
} else {
|
||||||
|
showFragment.setArguments(bundle);
|
||||||
|
fragmentTransaction.show(showFragment);
|
||||||
|
}
|
||||||
|
fragmentTransaction.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildFragmentTag(int subscriptionId) {
|
||||||
|
return MOBILE_SETTINGS_TAG + subscriptionId;
|
||||||
|
}
|
||||||
|
}
|
@@ -36,6 +36,7 @@ import androidx.preference.PreferenceScreen;
|
|||||||
|
|
||||||
import com.android.settings.core.FeatureFlags;
|
import com.android.settings.core.FeatureFlags;
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
import com.android.settings.core.PreferenceControllerMixin;
|
||||||
|
import com.android.settings.mobilenetwork.MobileSettingsActivity;
|
||||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||||
import com.android.settingslib.RestrictedPreference;
|
import com.android.settingslib.RestrictedPreference;
|
||||||
import com.android.settingslib.Utils;
|
import com.android.settingslib.Utils;
|
||||||
@@ -146,7 +147,8 @@ public class MobileNetworkPreferenceController extends AbstractPreferenceControl
|
|||||||
public boolean handlePreferenceTreeClick(Preference preference) {
|
public boolean handlePreferenceTreeClick(Preference preference) {
|
||||||
if (KEY_MOBILE_NETWORK_SETTINGS.equals(preference.getKey())) {
|
if (KEY_MOBILE_NETWORK_SETTINGS.equals(preference.getKey())) {
|
||||||
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MOBILE_NETWORK_V2)) {
|
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MOBILE_NETWORK_V2)) {
|
||||||
//TODO(b/110260193): go to the mobile network page existed in settings
|
final Intent intent = new Intent(mContext, MobileSettingsActivity.class);
|
||||||
|
mContext.startActivity(intent);
|
||||||
} else {
|
} else {
|
||||||
final Intent intent = new Intent(Intent.ACTION_MAIN);
|
final Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||||
intent.setComponent(
|
intent.setComponent(
|
||||||
|
@@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* 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.mobilenetwork;
|
||||||
|
|
||||||
|
import static com.android.settings.mobilenetwork.MobileSettingsActivity.MOBILE_SETTINGS_TAG;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.telephony.SubscriptionInfo;
|
||||||
|
import android.telephony.SubscriptionManager;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.android.internal.view.menu.ContextMenuBuilder;
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
|
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
public class MobileSettingsActivityTest {
|
||||||
|
|
||||||
|
private static final int CURRENT_SUB_ID = 3;
|
||||||
|
private static final int PREV_SUB_ID = 1;
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private MobileSettingsActivity mMobileSettingsActivity;
|
||||||
|
private List<SubscriptionInfo> mSubscriptionInfos;
|
||||||
|
private Fragment mShowFragment;
|
||||||
|
private Fragment mHideFragment;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private SubscriptionManager mSubscriptionManager;
|
||||||
|
@Mock
|
||||||
|
private SubscriptionInfo mSubscriptionInfo;
|
||||||
|
@Mock
|
||||||
|
private FragmentManager mFragmentManager;
|
||||||
|
@Mock
|
||||||
|
private FragmentTransaction mFragmentTransaction;
|
||||||
|
@Mock
|
||||||
|
private BottomNavigationView mBottomNavigationView;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
|
|
||||||
|
mMobileSettingsActivity = spy(new MobileSettingsActivity());
|
||||||
|
mSubscriptionInfos = new ArrayList<>();
|
||||||
|
mShowFragment = new Fragment();
|
||||||
|
mHideFragment = new Fragment();
|
||||||
|
mMobileSettingsActivity.mSubscriptionInfos = mSubscriptionInfos;
|
||||||
|
|
||||||
|
doReturn(mSubscriptionManager).when(mMobileSettingsActivity).getSystemService(
|
||||||
|
SubscriptionManager.class);
|
||||||
|
doReturn(mBottomNavigationView).when(mMobileSettingsActivity).findViewById(R.id.bottom_nav);
|
||||||
|
doReturn(mFragmentManager).when(mMobileSettingsActivity).getSupportFragmentManager();
|
||||||
|
doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction();
|
||||||
|
doReturn(mHideFragment).when(mFragmentManager).findFragmentByTag(
|
||||||
|
MOBILE_SETTINGS_TAG + PREV_SUB_ID);
|
||||||
|
doReturn(mShowFragment).when(mFragmentManager).findFragmentByTag(
|
||||||
|
MOBILE_SETTINGS_TAG + CURRENT_SUB_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateBottomNavigationView_oneSubscription_shouldBeGone() {
|
||||||
|
mSubscriptionInfos.add(mSubscriptionInfo);
|
||||||
|
doReturn(mSubscriptionInfos).when(mSubscriptionManager).getActiveSubscriptionInfoList();
|
||||||
|
|
||||||
|
mMobileSettingsActivity.updateBottomNavigationView();
|
||||||
|
|
||||||
|
verify(mBottomNavigationView).setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateBottomNavigationView_twoSubscription_updateMenu() {
|
||||||
|
final Menu menu = new ContextMenuBuilder(mContext);
|
||||||
|
mSubscriptionInfos.add(mSubscriptionInfo);
|
||||||
|
mSubscriptionInfos.add(mSubscriptionInfo);
|
||||||
|
doReturn(mSubscriptionInfos).when(mSubscriptionManager).getActiveSubscriptionInfoList();
|
||||||
|
doReturn(menu).when(mBottomNavigationView).getMenu();
|
||||||
|
|
||||||
|
mMobileSettingsActivity.updateBottomNavigationView();
|
||||||
|
|
||||||
|
assertThat(menu.size()).isEqualTo(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void switchFragment_hidePreviousFragment() {
|
||||||
|
mMobileSettingsActivity.mPrevSubscriptionId = PREV_SUB_ID;
|
||||||
|
|
||||||
|
mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID);
|
||||||
|
|
||||||
|
verify(mFragmentTransaction).hide(mHideFragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void switchFragment_fragmentExist_showItWithArguments() {
|
||||||
|
mMobileSettingsActivity.mPrevSubscriptionId = PREV_SUB_ID;
|
||||||
|
|
||||||
|
mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID);
|
||||||
|
|
||||||
|
assertThat(mShowFragment.getArguments().getInt(
|
||||||
|
MobileSettingsActivity.KEY_SUBSCRIPTION_ID)).isEqualTo(CURRENT_SUB_ID);
|
||||||
|
verify(mFragmentTransaction).show(mShowFragment);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user