Merge "Log visibility change for all fragments."

This commit is contained in:
TreeHugger Robot
2016-08-18 21:05:59 +00:00
committed by Android (Google) Code Review
183 changed files with 556 additions and 288 deletions

View File

@@ -253,7 +253,7 @@ public class ApnEditor extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APN_EDITOR;
}

View File

@@ -149,7 +149,7 @@ public class ApnSettings extends RestrictedSettingsFragment implements
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APN;
}

View File

@@ -44,7 +44,7 @@ public class ApplicationSettings extends SettingsPreferenceFragment {
private ListPreference mInstallLocation;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATION;
}

View File

@@ -123,7 +123,7 @@ public class ChooseLockGeneric extends SettingsActivity {
protected boolean mForFingerprint = false;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CHOOSE_LOCK_GENERIC;
}

View File

@@ -50,6 +50,7 @@ import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils.RequestThrottledException;
import com.android.internal.widget.TextViewInputDisabler;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.notification.RedactionInterstitial;
import com.android.settings.password.PasswordRequirementAdapter;
import com.android.setupwizardlib.GlifLayout;
@@ -437,7 +438,7 @@ public class ChooseLockPassword extends SettingsActivity {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CHOOSE_LOCK_PASSWORD;
}

View File

@@ -36,6 +36,7 @@ import com.android.internal.widget.LockPatternUtils.RequestThrottledException;
import com.android.internal.widget.LockPatternView;
import com.android.internal.widget.LockPatternView.Cell;
import com.android.internal.widget.LockPatternView.DisplayMode;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.notification.RedactionInterstitial;
import com.android.setupwizardlib.GlifLayout;
import com.google.android.collect.Lists;
@@ -240,7 +241,7 @@ public class ChooseLockPattern extends SettingsActivity {
};
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CHOOSE_LOCK_PATTERN;
}

View File

@@ -251,7 +251,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CONFIRM_LOCK_PASSWORD;
}

View File

@@ -194,7 +194,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CONFIRM_LOCK_PATTERN;
}

View File

@@ -35,6 +35,7 @@ import android.widget.Button;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.core.InstrumentedFragment;
import java.util.Locale;
@@ -43,7 +44,7 @@ public class CryptKeeperConfirm extends InstrumentedFragment {
private static final String TAG = "CryptKeeperConfirm";
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CRYPT_KEEPER_CONFIRM;
}

View File

@@ -36,6 +36,7 @@ import android.view.ViewGroup;
import android.widget.Button;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.core.InstrumentedFragment;
public class CryptKeeperSettings extends InstrumentedFragment {
private static final String TAG = "CryptKeeper";
@@ -115,7 +116,7 @@ public class CryptKeeperSettings extends InstrumentedFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CRYPT_KEEPER;
}

View File

@@ -83,7 +83,7 @@ public class DateTimeSettings extends SettingsPreferenceFragment
private Preference mDatePref;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DATE_TIME;
}

View File

@@ -332,7 +332,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DEVELOPMENT;
}

View File

@@ -17,7 +17,6 @@
package com.android.settings;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AppGlobals;
import android.app.ListFragment;
import android.app.admin.DeviceAdminInfo;
@@ -31,7 +30,6 @@ import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
@@ -50,6 +48,10 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.android.internal.logging.MetricsProto;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.core.instrumentation.Instrumentable;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
@@ -58,13 +60,14 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class DeviceAdminSettings extends ListFragment {
public class DeviceAdminSettings extends ListFragment implements Instrumentable {
static final String TAG = "DeviceAdminSettings";
private final VisibilityLoggerMixin mVisibilityLoggerMixin =
new VisibilityLoggerMixin(this);
private DevicePolicyManager mDPM;
private UserManager mUm;
private static class DeviceAdminListItem implements Comparable<DeviceAdminListItem> {
public DeviceAdminInfo info;
@@ -103,6 +106,11 @@ public class DeviceAdminSettings extends ListFragment {
}
};
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.DEVICE_ADMIN_SETTINGS;
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -126,9 +134,11 @@ public class DeviceAdminSettings extends ListFragment {
@Override
public void onResume() {
super.onResume();
final Activity activity = getActivity();
mVisibilityLoggerMixin.onResume(activity);
IntentFilter filter = new IntentFilter();
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
getActivity().registerReceiverAsUser(
activity.registerReceiverAsUser(
mBroadcastReceiver, UserHandle.ALL, filter, null, null);
final ComponentName deviceOwnerComponent = mDPM.getDeviceOwnerComponentOnAnyUser();
@@ -146,7 +156,9 @@ public class DeviceAdminSettings extends ListFragment {
@Override
public void onPause() {
getActivity().unregisterReceiver(mBroadcastReceiver);
final Activity activity = getActivity();
activity.unregisterReceiver(mBroadcastReceiver);
mVisibilityLoggerMixin.onPause(activity);
super.onPause();
}

View File

@@ -86,7 +86,7 @@ public class DeviceInfoSettings extends SettingsPreferenceFragment implements In
private boolean mDebuggingFeaturesDisallowedBySystem;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DEVICEINFO;
}

View File

@@ -102,7 +102,7 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
private SwitchPreference mCameraGesturePreference;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DISPLAY;
}

View File

@@ -76,7 +76,7 @@ public class DreamSettings extends SettingsPreferenceFragment implements
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DREAM;
}

View File

@@ -92,7 +92,7 @@ public class EncryptionInterstitial extends SettingsActivity {
private int mRequestedPasswordQuality;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ENCRYPTION;
}

View File

@@ -245,7 +245,7 @@ public class HomeSettings extends SettingsPreferenceFragment implements Indexabl
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.HOME;
}

View File

@@ -256,7 +256,7 @@ public class IccLockSettings extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ICC_LOCK;
}

View File

@@ -59,7 +59,7 @@ public class LegalSettings extends SettingsPreferenceFragment implements Indexab
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ABOUT_LEGAL_SETTINGS;
}

View File

@@ -306,7 +306,7 @@ public class MasterClear extends OptionsMenuFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.MASTER_CLEAR;
}
}

View File

@@ -177,7 +177,7 @@ public class MasterClearConfirm extends OptionsMenuFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.MASTER_CLEAR_CONFIRM;
}
}

View File

@@ -17,6 +17,8 @@ package com.android.settings;
import android.os.Bundle;
import com.android.settings.core.InstrumentedFragment;
/**
* Base class for a fragment that has the options menu.
* SettingsPreferenceFragment automatically sets this, but some activities do not use

View File

@@ -1,47 +0,0 @@
/*
* Copyright (C) 2014 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;
import android.app.ListFragment;
import android.view.View;
import android.view.ViewGroup;
/**
* A ListFragment with a pinned header
*/
public class PinnedHeaderListFragment extends ListFragment {
public PinnedHeaderListFragment() {
super();
}
/**
* Set the pinned header view. This can only be done when the ListView is already created.
*
* @param pinnedHeaderView the view to be used for the pinned header view.
*/
public void setPinnedHeaderView(View pinnedHeaderView) {
((ViewGroup) getListView().getParent()).addView(pinnedHeaderView, 0);
}
/**
* Clear the pinned header view. This can only be done when the ListView is already created.
*/
public void clearPinnedHeaderView() {
((ViewGroup) getListView().getParent()).removeViewAt(0);
}
}

View File

@@ -71,7 +71,7 @@ public class PrivacySettings extends SettingsPreferenceFragment implements Index
private boolean mEnabled;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.PRIVACY;
}

View File

@@ -41,6 +41,7 @@ import android.widget.TextView;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
import com.android.settings.core.InstrumentedFragment;
public class ProxySelector extends InstrumentedFragment implements DialogCreatable {
private static final String TAG = "ProxySelector";
@@ -272,7 +273,7 @@ public class ProxySelector extends InstrumentedFragment implements DialogCreatab
};
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.PROXY_SELECTOR;
}
}

View File

@@ -207,7 +207,7 @@ public class ResetNetwork extends OptionsMenuFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.RESET_NETWORK;
}
}

View File

@@ -149,7 +149,7 @@ public class ResetNetworkConfirm extends OptionsMenuFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.RESET_NETWORK_CONFIRM;
}
}

View File

@@ -55,7 +55,7 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
private LockPatternUtils mLockPatternUtils;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SCREEN_PINNING;
}

View File

@@ -153,7 +153,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
private String mCurrentProfilePassword;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SECURITY;
}
@@ -1011,7 +1011,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
private DevicePolicyManager mDPM;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SECURITY;
}

View File

@@ -45,6 +45,7 @@ import android.view.ViewGroup;
import android.widget.Button;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.InstrumentedFragment;
import com.android.settingslib.HelpUtils;
import java.util.UUID;

View File

@@ -39,7 +39,7 @@ public class TestingSettings extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.TESTING;
}
}

View File

@@ -119,7 +119,7 @@ public class TetherSettings extends RestrictedSettingsFragment
private Preference mDataSaverFooter;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.TETHER;
}

View File

@@ -70,7 +70,7 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.TRUST_AGENT;
}

View File

@@ -91,7 +91,7 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
private static final int REQUEST_CONFIRM_CREDENTIALS = 1;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.TRUSTED_CREDENTIALS;
}

View File

@@ -68,7 +68,7 @@ public class UserCredentialsSettings extends OptionsMenuFragment implements OnIt
private ListView mListView;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.USER_CREDENTIALS;
}

View File

@@ -37,13 +37,15 @@ import android.widget.SectionIndexer;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import com.android.internal.logging.MetricsProto;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.inputmethod.UserDictionaryAddWordContents;
import com.android.settings.inputmethod.UserDictionarySettingsUtils;
import com.android.settings.core.instrumentation.Instrumentable;
import java.util.Locale;
public class UserDictionarySettings extends ListFragment {
private static final String TAG = "UserDictionarySettings";
public class UserDictionarySettings extends ListFragment implements Instrumentable {
private static final String[] QUERY_PROJECTION = {
UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT
@@ -67,10 +69,17 @@ public class UserDictionarySettings extends ListFragment {
private static final int OPTIONS_MENU_ADD = Menu.FIRST;
private Cursor mCursor;
private final VisibilityLoggerMixin mVisibilityLoggerMixin =
new VisibilityLoggerMixin(this);
private Cursor mCursor;
protected String mLocale;
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.USER_DICTIONARY_SETTINGS;
}
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -116,6 +125,12 @@ public class UserDictionarySettings extends ListFragment {
UserDictionarySettingsUtils.getLocaleDisplayName(getActivity(), mLocale));
}
@Override
public void onResume() {
super.onResume();
mVisibilityLoggerMixin.onResume(getActivity());
}
private Cursor createCursor(final String locale) {
// Locale can be any of:
// - The string representation of a locale, as returned by Locale#toString()
@@ -174,6 +189,12 @@ public class UserDictionarySettings extends ListFragment {
return false;
}
@Override
public void onPause() {
super.onPause();
mVisibilityLoggerMixin.onPause(getActivity());
}
/**
* Add or edit a word. If editingWord is null, it's an add; otherwise, it's an edit.
* @param editingWord the word to edit, or null if it's an add.

View File

@@ -36,7 +36,7 @@ import java.util.List;
public class WallpaperTypeSettings extends SettingsPreferenceFragment implements Indexable {
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.WALLPAPER_TYPE;
}

View File

@@ -28,6 +28,7 @@ import android.util.Log;
import android.webkit.IWebViewUpdateService;
import android.webkit.WebViewProviderInfo;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.core.InstrumentedActivity;
import java.util.ArrayList;
@@ -97,7 +98,7 @@ public class WebViewImplementation extends InstrumentedActivity implements
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.WEBVIEW_IMPLEMENTATION;
}

View File

@@ -191,7 +191,7 @@ public class WifiCallingSettings extends SettingsPreferenceFragment
};
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.WIFI_CALLING;
}

View File

@@ -207,7 +207,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.WIRELESS;
}

View File

@@ -31,6 +31,9 @@ import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.android.internal.logging.MetricsProto;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settingslib.datetime.ZoneGetter;
import java.util.Collections;
@@ -46,8 +49,7 @@ import java.util.TimeZone;
* the time zone. Pressing Back without choosing from the list will not
* result in a change in the time zone setting.
*/
public class ZonePicker extends ListFragment {
private static final String TAG = "ZonePicker";
public class ZonePicker extends ListFragment implements Instrumentable {
public interface ZoneSelectionListener {
// You can add any argument if you really need it...
@@ -56,6 +58,7 @@ public class ZonePicker extends ListFragment {
private static final int MENU_TIMEZONE = Menu.FIRST+1;
private static final int MENU_ALPHABETICAL = Menu.FIRST;
private final VisibilityLoggerMixin mVisibilityLoggerMixin = new VisibilityLoggerMixin(this);
private boolean mSortedByTimezone;
@@ -132,6 +135,11 @@ public class ZonePicker extends ListFragment {
return TimeZone.getTimeZone((String)((Map<?, ?>)item).get(ZoneGetter.KEY_ID));
}
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.ZONE_PICKER;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
@@ -174,6 +182,12 @@ public class ZonePicker extends ListFragment {
}
}
@Override
public void onResume() {
super.onResume();
mVisibilityLoggerMixin.onResume(getActivity());
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
@@ -225,6 +239,12 @@ public class ZonePicker extends ListFragment {
}
}
@Override
public void onPause() {
super.onPause();
mVisibilityLoggerMixin.onPause(getActivity());
}
private static class MyComparator implements Comparator<Map<?, ?>> {
private String mSortingKey;

View File

@@ -198,7 +198,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private DevicePolicyManager mDpm;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY;
}

View File

@@ -37,8 +37,6 @@ import java.util.List;
public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener {
private static final String TAG = AccessibilitySettingsForSetupWizard.class.getSimpleName();
// Preferences.
private static final String DISPLAY_MAGNIFICATION_PREFERENCE =
"screen_magnification_preference";
@@ -50,7 +48,7 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
private Preference mScreenReaderPreference;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SUW_ACCESSIBILITY;
}

View File

@@ -97,7 +97,7 @@ public class CaptionPropertiesFragment extends SettingsPreferenceFragment
private boolean mShowingCustom;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_CAPTION_PROPERTIES;
}

View File

@@ -23,7 +23,7 @@ public class FontSizePreferenceFragmentForSetupWizard
extends ToggleFontSizePreferenceFragment {
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SUW_ACCESSIBILITY_FONT_SIZE;
}

View File

@@ -78,7 +78,7 @@ public class ToggleAccessibilityServicePreferenceFragment
private int mShownDialogId;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_SERVICE;
}

View File

@@ -100,7 +100,7 @@ public class ToggleAutoclickPreferenceFragment extends ToggleFeaturePreferenceFr
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_TOGGLE_AUTOCLICK;
}

View File

@@ -37,7 +37,7 @@ public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceF
private ListPreference mType;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_TOGGLE_DALTONIZER;
}

View File

@@ -73,7 +73,7 @@ public class ToggleFontSizePreferenceFragment extends PreviewSeekBarPreferenceFr
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_FONT_SIZE;
}

View File

@@ -45,7 +45,7 @@ public class ToggleGlobalGesturePreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE;
}
}

View File

@@ -178,7 +178,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends ToggleFeaturePr
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
}

View File

@@ -33,7 +33,7 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
}

View File

@@ -33,7 +33,7 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER;
}

View File

@@ -134,7 +134,7 @@ public class AccountSettings extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCOUNT;
}

View File

@@ -145,7 +145,7 @@ public class AccountSyncSettings extends AccountPreferenceBase {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCOUNTS_ACCOUNT_SYNC;
}

View File

@@ -93,7 +93,7 @@ public class ChooseAccountActivity extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY;
}

View File

@@ -88,7 +88,7 @@ public class ManageAccountsSettings extends AccountPreferenceBase
private Account mFirstAccount;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.ACCOUNTS_MANAGE_ACCOUNTS;
}

View File

@@ -118,7 +118,7 @@ public class ManagedProfileSettings extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.ACCOUNTS_WORK_PROFILE_SETTINGS;
}

View File

@@ -77,7 +77,7 @@ public class AdvancedAppSettings extends SettingsPreferenceFragment implements
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_ADVANCED;
}

View File

@@ -212,7 +212,7 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_APP_LAUNCH;
}
}

View File

@@ -39,7 +39,7 @@ import android.widget.Switch;
import android.widget.TextView;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
@@ -180,7 +180,7 @@ public class AppOpsDetails extends InstrumentedFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APP_OPS_DETAILS;
}

View File

@@ -29,7 +29,7 @@ import android.view.View;
import android.view.ViewGroup;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
public class AppOpsSummary extends InstrumentedFragment {
@@ -52,7 +52,7 @@ public class AppOpsSummary extends InstrumentedFragment {
int mCurPos;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APP_OPS_SUMMARY;
}

View File

@@ -604,7 +604,7 @@ public class AppStorageSettings extends AppInfoWithHeader
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_APP_STORAGE;
}

View File

@@ -16,21 +16,15 @@
package com.android.settings.applications;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.preference.PreferenceFrameLayout;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
public class BackgroundCheckSummary extends InstrumentedFragment {
@@ -38,7 +32,7 @@ public class BackgroundCheckSummary extends InstrumentedFragment {
private LayoutInflater mInflater;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.BACKGROUND_CHECK_SUMMARY;
}

View File

@@ -49,7 +49,7 @@ public class ConfirmConvertToFbe extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CONVERT_FBE_CONFIRM;
}
}

View File

@@ -84,7 +84,7 @@ public class ConvertToFbe extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.CONVERT_FBE;
}
}

View File

@@ -157,7 +157,7 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SYSTEM_ALERT_WINDOW_APPS;
}

View File

@@ -326,7 +326,7 @@ public class InstalledAppDetails extends AppInfoBase
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_INSTALLED_APP_DETAILS;
}

View File

@@ -54,7 +54,7 @@ import android.widget.SectionIndexer;
import android.widget.Spinner;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.AppHeader;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.Settings.AllApplicationsActivity;
import com.android.settings.Settings.DomainsURLsAppListActivity;
@@ -409,7 +409,7 @@ public class ManageApplications extends InstrumentedFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
switch (mListType) {
case LIST_TYPE_MAIN:
return MetricsEvent.MANAGE_APPLICATIONS;

View File

@@ -74,7 +74,7 @@ public class ManageAssist extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_MANAGE_ASSIST;
}

View File

@@ -18,7 +18,6 @@ import android.annotation.Nullable;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
@@ -28,7 +27,6 @@ import android.view.View;
import com.android.internal.logging.MetricsProto;
import com.android.internal.telephony.SmsUsageMonitor;
import com.android.settings.DividerPreference;
import com.android.settings.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.applications.AppStateBaseBridge.Callback;
import com.android.settings.applications.AppStateSmsPremBridge.SmsState;
@@ -76,7 +74,7 @@ public class PremiumSmsAccess extends EmptyTextSettings implements Callback, Cal
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.PREMIUM_SMS_ACCESS;
}

View File

@@ -125,7 +125,7 @@ public class ProcessStatsDetail extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_PROCESS_STATS_DETAIL;
}

View File

@@ -26,7 +26,7 @@ import android.widget.TextView;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import static com.android.settings.Utils.prepareCustomPreferencesList;
@@ -86,7 +86,7 @@ public class ProcessStatsMemDetail extends InstrumentedFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_PROCESS_STATS_MEM_DETAIL;
}

View File

@@ -98,7 +98,7 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.PROCESS_STATS_SUMMARY;
}

View File

@@ -91,7 +91,7 @@ public class ProcessStatsUi extends ProcessStatsBase {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_PROCESS_STATS_UI;
}

View File

@@ -33,7 +33,7 @@ import android.widget.Button;
import android.widget.TextView;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.Utils;
@@ -534,7 +534,7 @@ public class RunningServiceDetails extends InstrumentedFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.RUNNING_SERVICE_DETAILS;
}

View File

@@ -108,7 +108,7 @@ public class RunningServices extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.RUNNING_SERVICES;
}

View File

@@ -27,7 +27,7 @@ public class SpecialAccessSettings extends SettingsPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SPECIAL_ACCESS;
}
}

View File

@@ -162,7 +162,7 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_USAGE_ACCESS_DETAIL;
}

View File

@@ -45,7 +45,7 @@ public class VrListenerSettings extends ManagedServiceSettings {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.VR_MANAGE_LISTENERS;
}
}

View File

@@ -153,7 +153,7 @@ public class WriteSettingsDetails extends AppInfoWithHeader implements OnPrefere
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.SYSTEM_ALERT_WINDOW_APPS;
}

View File

@@ -192,7 +192,7 @@ public class ToggleBackupSettingFragment extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.PRIVACY;
}

View File

@@ -133,7 +133,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.BLUETOOTH;
}

View File

@@ -85,7 +85,7 @@ public final class DevicePickerFragment extends DeviceListPreferenceFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.BLUETOOTH_DEVICE_PICKER;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* 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.
@@ -14,34 +14,29 @@
* limitations under the License.
*/
package com.android.settings;
package com.android.settings.core;
import android.app.Activity;
import com.android.internal.logging.MetricsLogger;
import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
/**
* Instrumented activity that logs visibility state.
*/
public abstract class InstrumentedActivity extends Activity {
/**
* Declare the view of this category.
*
* Categories are defined in {@link com.android.internal.logging.MetricsProto.MetricsEvent}
* or if there is no relevant existing category you may define one in
* {@link com.android.settings.InstrumentedFragment}.
*/
protected abstract int getMetricsCategory();
public abstract class InstrumentedActivity extends Activity implements Instrumentable {
private final VisibilityLoggerMixin mVisibilityLoggerMixin = new VisibilityLoggerMixin(this);
@Override
public void onResume() {
super.onResume();
MetricsLogger.visible(this, getMetricsCategory());
mVisibilityLoggerMixin.onResume(this);
}
@Override
public void onPause() {
super.onPause();
MetricsLogger.hidden(this, getMetricsCategory());
mVisibilityLoggerMixin.onPause(this);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* 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.
@@ -14,31 +14,20 @@
* limitations under the License.
*/
package com.android.settings;
package com.android.settings.core;
import android.os.Bundle;
import android.support.v14.preference.PreferenceFragment;
import com.android.internal.logging.MetricsLogger;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.core.instrumentation.Instrumentable;
/**
* Instrumented fragment that logs visibility state.
*/
public abstract class InstrumentedFragment extends PreferenceFragment {
// Declare new temporary categories here, starting after this value.
public static final int UNDECLARED = 100000;
public abstract class InstrumentedFragment extends PreferenceFragment implements Instrumentable {
// Used by PreferenceActivity for the dummy fragment it adds, no useful data here.
public static final int PREFERENCE_ACTIVITY_FRAGMENT = UNDECLARED + 1;
/**
* Declare the view of this category.
*
* Categories are defined in {@link com.android.internal.logging.MetricsProto.MetricsEvent}
* or if there is no relevant existing category you may define one in
* {@link com.android.settings.InstrumentedFragment}.
*/
protected abstract int getMetricsCategory();
private final VisibilityLoggerMixin mVisibilityLoggerMixin = new VisibilityLoggerMixin(this);
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -47,12 +36,12 @@ public abstract class InstrumentedFragment extends PreferenceFragment {
@Override
public void onResume() {
super.onResume();
MetricsLogger.visible(getActivity(), getMetricsCategory());
mVisibilityLoggerMixin.onResume(getActivity());
}
@Override
public void onPause() {
super.onPause();
MetricsLogger.hidden(getActivity(), getMetricsCategory());
mVisibilityLoggerMixin.onPause(getActivity());
}
}

View File

@@ -0,0 +1,59 @@
/*
* 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.core.instrumentation;
import android.content.Context;
import com.android.internal.logging.MetricsLogger;
/**
* Pass-through Metrics logger for {@link MetricsLogger}.
*/
public class EventLogWriter {
public void visible(Context context, int category) {
MetricsLogger.visible(context, category);
}
public void hidden(Context context, int category) {
MetricsLogger.hidden(context, category);
}
public void action(Context context, int category) {
MetricsLogger.action(context, category, "");
}
public void action(Context context, int category, int value) {
MetricsLogger.action(context, category, Integer.toString(value));
}
public void action(Context context, int category, boolean value) {
MetricsLogger.action(context, category, Boolean.toString(value));
}
public void action(Context context, int category, String pkg) {
MetricsLogger.action(context, category, pkg);
}
public void count(Context context, String name, int value) {
MetricsLogger.count(context, name, value);
}
public void histogram(Context context, String name, int bucket) {
MetricsLogger.histogram(context, name, bucket);
}
}

View File

@@ -0,0 +1,26 @@
/*
* 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.core.instrumentation;
public interface Instrumentable {
/**
* Instrumented name for a view as defined in
* {@link com.android.internal.logging.MetricsProto.MetricsEvent}.
*/
int getMetricsCategory();
}

View File

@@ -0,0 +1,38 @@
/*
* 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.core.instrumentation;
public class MetricsFactory {
private static MetricsFactory sInstance;
private EventLogWriter mLogger;
public static MetricsFactory get() {
if (sInstance == null) {
sInstance = new MetricsFactory();
}
return sInstance;
}
public EventLogWriter getLogger() {
if (mLogger == null) {
mLogger = new EventLogWriter();
}
return mLogger;
}
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.instrumentation;
import android.content.Context;
/**
* Logs visibility change of a fragment.
*/
public class VisibilityLoggerMixin {
private final Instrumentable mInstrumentable;
private final EventLogWriter mEventLogWriter;
public VisibilityLoggerMixin(Instrumentable instrumentable) {
this(instrumentable, MetricsFactory.get().getLogger());
}
public VisibilityLoggerMixin(Instrumentable instrumentable, EventLogWriter eventLogWriter) {
mInstrumentable = instrumentable;
mEventLogWriter = eventLogWriter;
}
public void onResume(Context context) {
mEventLogWriter.visible(context, mInstrumentable.getMetricsCategory());
}
public void onPause(Context context) {
mEventLogWriter.hidden(context, mInstrumentable.getMetricsCategory());
}
}

View File

@@ -29,7 +29,7 @@ import android.view.ViewGroup;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.overlay.FeatureFactory;
@@ -55,7 +55,7 @@ public final class DashboardContainerFragment extends InstrumentedFragment {
private DashboardViewPagerAdapter mPagerAdapter;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.DASHBOARD_CONTAINER;
}

View File

@@ -28,7 +28,7 @@ import android.view.ViewGroup;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.Settings;
import com.android.settings.SettingsActivity;
@@ -36,7 +36,6 @@ import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.dashboard.conditional.FocusRecyclerView;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.SuggestionParser;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity;
@@ -78,7 +77,7 @@ public class DashboardSummary extends InstrumentedFragment
private HashSet<String> mSuggestionsHiddenLogged;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DASHBOARD_SUMMARY;
}

View File

@@ -39,7 +39,7 @@ import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
@@ -250,7 +250,7 @@ public class SearchResultsSummary extends InstrumentedFragment {
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DASHBOARD_SEARCH_RESULTS;
}

View File

@@ -36,7 +36,7 @@ import android.view.View;
import android.view.ViewGroup;
import com.android.internal.logging.MetricsProto;
import com.android.settings.InstrumentedFragment;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.overlay.SupportFeatureProvider;
@@ -77,7 +77,7 @@ public final class SupportFragment extends InstrumentedFragment implements View.
private ConnectivityManager mConnectivityManager;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SUPPORT_FRAGMENT;
}

View File

@@ -357,7 +357,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.APP_DATA_USAGE;
}

View File

@@ -139,7 +139,7 @@ public class BillingCycleSettings extends DataUsageBase implements
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.BILLING_CYCLE;
}

View File

@@ -100,7 +100,7 @@ public class DataSaverSummary extends SettingsPreferenceFragment
}
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DATA_SAVER_SUMMARY;
}

View File

@@ -109,7 +109,7 @@ public class DataUsageList extends DataUsageBase {
private View mHeader;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.DATA_USAGE_LIST;
}

View File

@@ -61,7 +61,7 @@ public class DataUsageMeteredSettings extends SettingsPreferenceFragment impleme
private Preference mWifiDisabled;
@Override
protected int getMetricsCategory() {
public int getMetricsCategory() {
return MetricsEvent.NET_DATA_USAGE_METERED;
}

Some files were not shown because too many files have changed in this diff Show More