From 7ea14c5625c988a81c09625f54faed846fc07ec7 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 22 Jan 2016 14:28:02 -0500 Subject: [PATCH] Move Home settings to Default apps Change-Id: I2ac7f9dd2c1c505ff3163b2a90c574a360b9409c --- AndroidManifest.xml | 28 +---- res/layout/app_preference_item.xml | 50 +++++--- res/values/strings.xml | 6 + res/xml/default_apps.xml | 6 + .../android/settings/AppListPreference.java | 39 ++++-- .../android/settings/SettingsActivity.java | 40 +----- .../android/settings/SmsDefaultDialog.java | 4 +- .../applications/DefaultHomePreference.java | 118 ++++++++++++++++++ 8 files changed, 204 insertions(+), 87 deletions(-) create mode 100644 src/com/android/settings/applications/DefaultHomePreference.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b661a1e1535..90d87933c5e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -864,30 +864,6 @@ android:value="true" /> - - - - - - - - - - - - - - - - - - + + + + - + + android:layout_gravity="center_vertical" + android:duplicateParentState="true" + android:orientation="vertical"> + + + + android:duplicateParentState="true" + /> diff --git a/res/values/strings.xml b/res/values/strings.xml index 385034fb9ca..096514f9ef5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7005,4 +7005,10 @@ Allow unrestricted data access when Data Saver is on + + Home app + + + No default Home + diff --git a/res/xml/default_apps.xml b/res/xml/default_apps.xml index a38ef4ac4c2..76d0e8ca5b6 100644 --- a/res/xml/default_apps.xml +++ b/res/xml/default_apps.xml @@ -25,6 +25,12 @@ android:title="@string/assist_and_voice_input_title" /> + + { private Drawable[] mImageDrawables = null; @@ -62,17 +62,31 @@ public class AppListPreference extends CustomListPreference { mImageDrawables = imageDrawables; } + @Override + public boolean isEnabled(int position) { + return mSummaries == null || mSummaries[position] == null; + } + @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); View view = inflater.inflate(R.layout.app_preference_item, parent, false); - TextView textView = (TextView) view.findViewById(R.id.app_label); + TextView textView = (TextView) view.findViewById(android.R.id.title); textView.setText(getItem(position)); if (position == mSelectedIndex) { view.findViewById(R.id.default_label).setVisibility(View.VISIBLE); } - ImageView imageView = (ImageView)view.findViewById(R.id.app_image); + ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); imageView.setImageDrawable(mImageDrawables[position]); + // Summaries are describing why a item is disabled, so anything with a summary + // is not enabled. + boolean enabled = mSummaries == null || mSummaries[position] == null; + view.setEnabled(enabled); + if (!enabled) { + TextView summary = (TextView) view.findViewById(android.R.id.summary); + summary.setText(mSummaries[position]); + summary.setVisibility(View.VISIBLE); + } return view; } } @@ -133,6 +147,12 @@ public class AppListPreference extends CustomListPreference { } public void setComponentNames(ComponentName[] componentNames, ComponentName defaultCN) { + setComponentNames(componentNames, defaultCN, null); + } + + public void setComponentNames(ComponentName[] componentNames, ComponentName defaultCN, + CharSequence[] summaries) { + mSummaries = summaries; // Look up all package names in PackageManager. Skip ones we can't find. PackageManager pm = getContext().getPackageManager(); final int entryCount = componentNames.length + (mShowItemNone ? 1 : 0); @@ -192,7 +212,7 @@ public class AppListPreference extends CustomListPreference { @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); - return new SavedState(getEntryValues(), getValue(), mShowItemNone, superState); + return new SavedState(getEntryValues(), getValue(), mSummaries, mShowItemNone, superState); } @Override @@ -201,6 +221,7 @@ public class AppListPreference extends CustomListPreference { SavedState savedState = (SavedState) state; mShowItemNone = savedState.showItemNone; setPackageNames(savedState.entryValues, savedState.value); + mSummaries = savedState.summaries; super.onRestoreInstanceState(savedState.superState); } else { super.onRestoreInstanceState(state); @@ -213,13 +234,15 @@ public class AppListPreference extends CustomListPreference { public final CharSequence value; public final boolean showItemNone; public final Parcelable superState; + public final CharSequence[] summaries; - public SavedState(CharSequence[] entryValues, CharSequence value, boolean showItemNone, - Parcelable superState) { + public SavedState(CharSequence[] entryValues, CharSequence value, CharSequence[] summaries, + boolean showItemNone, Parcelable superState) { this.entryValues = entryValues; this.value = value; this.showItemNone = showItemNone; this.superState = superState; + this.summaries = summaries; } @Override @@ -233,6 +256,7 @@ public class AppListPreference extends CustomListPreference { dest.writeCharSequence(value); dest.writeInt(showItemNone ? 1 : 0); dest.writeParcelable(superState, flags); + dest.writeCharSequenceArray(summaries); } public static Creator CREATOR = new Creator() { @@ -242,7 +266,8 @@ public class AppListPreference extends CustomListPreference { CharSequence value = source.readCharSequence(); boolean showItemNone = source.readInt() != 0; Parcelable superState = source.readParcelable(getClass().getClassLoader()); - return new SavedState(entryValues, value, showItemNone, superState); + CharSequence[] summaries = source.readCharSequenceArray(); + return new SavedState(entryValues, value, summaries, showItemNone, superState); } @Override diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index dc134ff4a32..db9d9c31f47 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -29,7 +29,6 @@ import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.nfc.NfcAdapter; import android.os.AsyncTask; @@ -114,8 +113,8 @@ import com.android.settings.wifi.SavedAccessPointsWifiSettings; import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.p2p.WifiP2pSettings; import com.android.settingslib.drawer.DashboardCategory; -import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.SettingsDrawerActivity; +import com.android.settingslib.drawer.Tile; import java.util.ArrayList; import java.util.List; @@ -380,7 +379,6 @@ public class SettingsActivity extends SettingsDrawerActivity private static final String MSG_DATA_FORCE_REFRESH = "msg_data_force_refresh"; private boolean mNeedToRevertToInitialFragment = false; - private int mHomeActivitiesCount = 1; private Intent mResultIntentData; private ComponentName mCurrentSuggestion; @@ -561,8 +559,6 @@ public class SettingsActivity extends SettingsDrawerActivity mDisplayHomeAsUpEnabled = savedState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP); mDisplaySearch = savedState.getBoolean(SAVE_KEY_SHOW_SEARCH); - mHomeActivitiesCount = savedState.getInt(SAVE_KEY_HOME_ACTIVITIES_COUNT, - 1 /* one home activity by default */); } else { if (!mIsShowingDashboard) { mDisplaySearch = false; @@ -651,17 +647,10 @@ public class SettingsActivity extends SettingsDrawerActivity } } - mHomeActivitiesCount = getHomeActivitiesCount(); if (DEBUG_TIMING) Log.d(LOG_TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms"); } - private int getHomeActivitiesCount() { - final ArrayList homeApps = new ArrayList(); - getPackageManager().getHomeActivities(homeApps); - return homeApps.size(); - } - private void setTitleFromIntent(Intent intent) { final int initialTitleResId = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1); if (initialTitleResId > 0) { @@ -751,8 +740,6 @@ public class SettingsActivity extends SettingsDrawerActivity String query = (mSearchView != null) ? mSearchView.getQuery().toString() : EMPTY_QUERY; outState.putString(SAVE_KEY_SEARCH_QUERY, query); } - - outState.putInt(SAVE_KEY_HOME_ACTIVITIES_COUNT, mHomeActivitiesCount); } @Override @@ -1021,10 +1008,6 @@ public class SettingsActivity extends SettingsDrawerActivity Settings.PowerUsageSummaryActivity.class.getName()), mBatteryPresent, isAdmin, pm); - setTileEnabled(new ComponentName(packageName, - Settings.HomeSettingsActivity.class.getName()), - updateHomeSettingTiles(), isAdmin, pm); - setTileEnabled(new ComponentName(packageName, Settings.UserSettingsActivity.class.getName()), UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers() @@ -1081,27 +1064,6 @@ public class SettingsActivity extends SettingsDrawerActivity } } - private boolean updateHomeSettingTiles() { - // Once we decide to show Home settings, keep showing it forever - SharedPreferences sp = getSharedPreferences(HomeSettings.HOME_PREFS, Context.MODE_PRIVATE); - if (sp.getBoolean(HomeSettings.HOME_PREFS_DO_SHOW, false)) { - return true; - } - - try { - mHomeActivitiesCount = getHomeActivitiesCount(); - if (mHomeActivitiesCount < 2) { - return false; - } - } catch (Exception e) { - // Can't look up the home activity; bail on configuring the icon - Log.w(LOG_TAG, "Problem looking up home activity!", e); - } - - sp.edit().putBoolean(HomeSettings.HOME_PREFS_DO_SHOW, true).apply(); - return true; - } - private void getMetaData() { try { ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(), diff --git a/src/com/android/settings/SmsDefaultDialog.java b/src/com/android/settings/SmsDefaultDialog.java index a1af02140f7..e38c9b8f46d 100644 --- a/src/com/android/settings/SmsDefaultDialog.java +++ b/src/com/android/settings/SmsDefaultDialog.java @@ -187,14 +187,14 @@ public final class SmsDefaultDialog extends AlertActivity implements Item item = ((Item) getItem(position)); LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.app_preference_item, parent, false); - TextView textView = (TextView) view.findViewById(R.id.app_label); + TextView textView = (TextView) view.findViewById(android.R.id.title); textView.setText(item.label); if (position == mSelectedIndex) { view.findViewById(R.id.default_label).setVisibility(View.VISIBLE); } else { view.findViewById(R.id.default_label).setVisibility(View.GONE); } - ImageView imageView = (ImageView)view.findViewById(R.id.app_image); + ImageView imageView = (ImageView)view.findViewById(android.R.id.icon); imageView.setImageDrawable(item.icon); return view; } diff --git a/src/com/android/settings/applications/DefaultHomePreference.java b/src/com/android/settings/applications/DefaultHomePreference.java new file mode 100644 index 00000000000..7426ce69020 --- /dev/null +++ b/src/com/android/settings/applications/DefaultHomePreference.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2016 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.applications; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.UserInfo; +import android.os.Build; +import android.os.UserManager; +import android.util.AttributeSet; +import com.android.settings.AppListPreference; +import com.android.settings.R; + +import java.util.ArrayList; +import java.util.List; + +public class DefaultHomePreference extends AppListPreference { + + private final ArrayList mAllHomeComponents = new ArrayList<>(); + private final IntentFilter mHomeFilter; + + public DefaultHomePreference(Context context, AttributeSet attrs) { + super(context, attrs); + mHomeFilter = new IntentFilter(Intent.ACTION_MAIN); + mHomeFilter.addCategory(Intent.CATEGORY_HOME); + mHomeFilter.addCategory(Intent.CATEGORY_DEFAULT); + refreshHomeOptions(); + } + + @Override + public void performClick() { + refreshHomeOptions(); + super.performClick(); + } + + @Override + protected boolean persistString(String value) { + if (value != null) { + ComponentName component = ComponentName.unflattenFromString(value); + getContext().getPackageManager().replacePreferredActivity(mHomeFilter, + IntentFilter.MATCH_CATEGORY_EMPTY, + mAllHomeComponents.toArray(new ComponentName[0]), component); + setSummary(getEntry()); + } + return super.persistString(value); + } + + public void refreshHomeOptions() { + final String myPkg = getContext().getPackageName(); + ArrayList homeActivities = new ArrayList(); + PackageManager pm = getContext().getPackageManager(); + ComponentName currentDefaultHome = pm.getHomeActivities(homeActivities); + ArrayList components = new ArrayList<>(); + mAllHomeComponents.clear(); + List summaries = new ArrayList<>(); + + boolean mustSupportManagedProfile = hasManagedProfile(); + for (int i = 0; i < homeActivities.size(); i++) { + final ResolveInfo candidate = homeActivities.get(i); + final ActivityInfo info = candidate.activityInfo; + ComponentName activityName = new ComponentName(info.packageName, info.name); + mAllHomeComponents.add(activityName); + if (info.packageName.equals(myPkg)) { + continue; + } + components.add(activityName); + if (mustSupportManagedProfile && !launcherHasManagedProfilesFeature(candidate, pm)) { + summaries.add(getContext().getString(R.string.home_work_profile_not_supported)); + } else { + summaries.add(null); + } + } + setComponentNames(components.toArray(new ComponentName[0]), currentDefaultHome, + summaries.toArray(new CharSequence[0])); + } + + private boolean launcherHasManagedProfilesFeature(ResolveInfo resolveInfo, PackageManager pm) { + try { + ApplicationInfo appInfo = pm.getApplicationInfo( + resolveInfo.activityInfo.packageName, 0 /* default flags */); + return versionNumberAtLeastL(appInfo.targetSdkVersion); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + + private boolean versionNumberAtLeastL(int versionNumber) { + return versionNumber >= Build.VERSION_CODES.LOLLIPOP; + } + + private boolean hasManagedProfile() { + UserManager userManager = getContext().getSystemService(UserManager.class); + List profiles = userManager.getProfiles(getContext().getUserId()); + for (UserInfo userInfo : profiles) { + if (userInfo.isManagedProfile()) return true; + } + return false; + } + +}