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
126 lines
4.6 KiB
Java
126 lines
4.6 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
} |