Add debug app / wait for debugger dev options.

Re-organize dev options a bit.

Change-Id: I291b177c87cb8fb4bd8316d05aa6eadfaaf5f0d2
This commit is contained in:
Dianne Hackborn
2012-02-14 13:25:41 -08:00
parent 31c5ec8202
commit 9244df4c64
7 changed files with 344 additions and 77 deletions

View File

@@ -1019,6 +1019,9 @@
android:resource="@id/development_settings" /> android:resource="@id/development_settings" />
</activity-alias> </activity-alias>
<activity android:name=".AppPicker" android:label="@string/select_application"
android:theme="@android:style/Theme.Holo.Dialog" />
<activity android:name="Settings$UsbSettingsActivity" <activity android:name="Settings$UsbSettingsActivity"
android:label="@string/storage_title_usb" android:label="@string/storage_title_usb"
android:clearTaskOnLaunch="true"> android:clearTaskOnLaunch="true">

View File

@@ -3480,6 +3480,27 @@
<!-- HDCP checking dialog title, used for debug purposes only. [CHAR LIMIT=25] --> <!-- HDCP checking dialog title, used for debug purposes only. [CHAR LIMIT=25] -->
<string name="hdcp_checking_dialog_title">Set HDCP checking behavior</string> <string name="hdcp_checking_dialog_title">Set HDCP checking behavior</string>
<!-- Preference category for app debugging development settings. [CHAR LIMIT=50] -->
<string name="debug_debugging_category">Debugging</string>
<!-- UI debug setting: select current app to debug [CHAR LIMIT=50] -->
<string name="debug_app">Select debug app</string>
<!-- UI debug setting: no debug app has been set [CHAR LIMIT=50] -->
<string name="debug_app_not_set">No debug application set</string>
<!-- UI debug setting: debug app has been set [CHAR LIMIT=50] -->
<string name="debug_app_set">Debugging application: <xliff:g id="app_name">%1$s</xliff:g></string>
<!-- UI debug setting: title for app picker dialog [CHAR LIMIT=50] -->
<string name="select_application">Select application</string>
<!-- UI debug setting: label for app picker to select no applicatiojn [CHAR LIMIT=50] -->
<string name="no_application">Nothing</string>
<!-- UI debug setting: wait for debugger to attach to debugging process? [CHAR LIMIT=50] -->
<string name="wait_for_debugger">Wait for debugger</string>
<!-- UI debug setting: wait for debugger to attach to debugging process summary [CHAR LIMIT=50] -->
<string name="wait_for_debugger_summary">Debugged application waits for debugger to
attach before executing</string>
<!-- Preference category for user interface debugging development settings. [CHAR LIMIT=25] --> <!-- Preference category for user interface debugging development settings. [CHAR LIMIT=25] -->
<string name="debug_ui_category">User interface</string> <string name="debug_ui_category">User interface</string>

View File

@@ -17,11 +17,6 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/development_settings_title"> android:title="@string/development_settings_title">
<CheckBoxPreference
android:key="enable_adb"
android:title="@string/enable_adb"
android:summary="@string/enable_adb_summary"/>
<Preference <Preference
android:key="verifier_device_identifier" android:key="verifier_device_identifier"
style="?android:attr/preferenceInformationStyle" style="?android:attr/preferenceInformationStyle"
@@ -29,23 +24,6 @@
android:summary="@string/verifier_device_identifier_not_available" android:summary="@string/verifier_device_identifier_not_available"
android:persistent="false" /> android:persistent="false" />
<CheckBoxPreference
android:key="keep_screen_on"
android:title="@string/keep_screen_on"
android:summary="@string/keep_screen_on_summary"/>
<CheckBoxPreference
android:key="allow_mock_location"
android:title="@string/allow_mock_location"
android:summary="@string/allow_mock_location_summary"/>
<ListPreference
android:key="hdcp_checking"
android:title="@string/hdcp_checking_title"
android:dialogTitle="@string/hdcp_checking_dialog_title"
android:entries="@array/hdcp_checking_titles"
android:entryValues="@array/hdcp_checking_values" />
<PreferenceScreen <PreferenceScreen
android:key="local_backup_password" android:key="local_backup_password"
android:title="@string/local_backup_password_title" android:title="@string/local_backup_password_title"
@@ -57,6 +35,41 @@
android:targetClass="com.android.settings.SetFullBackupPassword" /> android:targetClass="com.android.settings.SetFullBackupPassword" />
</PreferenceScreen> </PreferenceScreen>
<CheckBoxPreference
android:key="keep_screen_on"
android:title="@string/keep_screen_on"
android:summary="@string/keep_screen_on_summary"/>
<ListPreference
android:key="hdcp_checking"
android:title="@string/hdcp_checking_title"
android:dialogTitle="@string/hdcp_checking_dialog_title"
android:entries="@array/hdcp_checking_titles"
android:entryValues="@array/hdcp_checking_values" />
<PreferenceCategory android:key="debug_debugging_category"
android:title="@string/debug_debugging_category">
<CheckBoxPreference
android:key="enable_adb"
android:title="@string/enable_adb"
android:summary="@string/enable_adb_summary"/>
<CheckBoxPreference
android:key="allow_mock_location"
android:title="@string/allow_mock_location"
android:summary="@string/allow_mock_location_summary"/>
<PreferenceScreen android:key="debug_app"
android:title="@string/debug_app" />
<CheckBoxPreference
android:key="wait_for_debugger"
android:title="@string/wait_for_debugger"
android:summary="@string/wait_for_debugger_summary"/>
</PreferenceCategory>
<PreferenceCategory android:key="debug_ui_category" <PreferenceCategory android:key="debug_ui_category"
android:title="@string/debug_ui_category"> android:title="@string/debug_ui_category">

View File

@@ -0,0 +1,144 @@
/*
* Copyright (C) 2008 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 java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.android.settings.applications.AppViewHolder;
import android.app.ActivityManagerNative;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.os.RemoteException;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class AppPicker extends ListActivity {
private AppListAdapter mAdapter;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mAdapter = new AppListAdapter(this);
if (mAdapter.getCount() <= 0) {
finish();
} else {
setListAdapter(mAdapter);
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
MyApplicationInfo app = mAdapter.getItem(position);
Intent intent = new Intent();
if (app.info != null) intent.setAction(app.info.packageName);
setResult(RESULT_OK, intent);
finish();
}
class MyApplicationInfo {
ApplicationInfo info;
CharSequence label;
}
public class AppListAdapter extends ArrayAdapter<MyApplicationInfo> {
private final List<MyApplicationInfo> mPackageInfoList = new ArrayList<MyApplicationInfo>();
private final LayoutInflater mInflater;
public AppListAdapter(Context context) {
super(context, 0);
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
List<ApplicationInfo> pkgs = context.getPackageManager().getInstalledApplications(0);
for (int i=0; i<pkgs.size(); i++) {
ApplicationInfo ai = pkgs.get(i);
if (ai.uid == Process.SYSTEM_UID) {
continue;
}
// On a user build, we only allow debugging of apps that
// are marked as debuggable. Otherwise (for platform development)
// we allow all apps.
if ((ai.flags&ApplicationInfo.FLAG_DEBUGGABLE) == 0
&& "user".equals(Build.TYPE)) {
continue;
}
MyApplicationInfo info = new MyApplicationInfo();
info.info = ai;
info.label = info.info.loadLabel(getPackageManager()).toString();
mPackageInfoList.add(info);
}
Collections.sort(mPackageInfoList, sDisplayNameComparator);
MyApplicationInfo info = new MyApplicationInfo();
info.label = context.getText(R.string.no_application);
mPackageInfoList.add(0, info);
addAll(mPackageInfoList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unnecessary calls
// to findViewById() on each row.
AppViewHolder holder = AppViewHolder.createOrRecycle(mInflater, convertView);
convertView = holder.rootView;
MyApplicationInfo info = getItem(position);
holder.appName.setText(info.label);
if (info.info != null) {
holder.appIcon.setImageDrawable(info.info.loadIcon(getPackageManager()));
holder.appSize.setText(info.info.packageName);
} else {
holder.appIcon.setImageDrawable(null);
holder.appSize.setText("");
}
holder.disabled.setVisibility(View.GONE);
holder.checkBox.setVisibility(View.GONE);
return convertView;
}
}
private final static Comparator<MyApplicationInfo> sDisplayNameComparator
= new Comparator<MyApplicationInfo>() {
public final int
compare(MyApplicationInfo a, MyApplicationInfo b) {
return collator.compare(a.label, b.label);
}
private final Collator collator = Collator.getInstance();
};
}

View File

@@ -28,6 +28,7 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierDeviceIdentity;
import android.os.BatteryManager; import android.os.BatteryManager;
@@ -69,6 +70,8 @@ public class DevelopmentSettings extends PreferenceFragment
private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password"; private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password";
private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw"; private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw";
private static final String DEBUG_APP_KEY = "debug_app";
private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger";
private static final String STRICT_MODE_KEY = "strict_mode"; private static final String STRICT_MODE_KEY = "strict_mode";
private static final String POINTER_LOCATION_KEY = "pointer_location"; private static final String POINTER_LOCATION_KEY = "pointer_location";
private static final String SHOW_TOUCHES_KEY = "show_touches"; private static final String SHOW_TOUCHES_KEY = "show_touches";
@@ -86,6 +89,8 @@ public class DevelopmentSettings extends PreferenceFragment
private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs"; private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs";
private static final int RESULT_DEBUG_APP = 1000;
private IWindowManager mWindowManager; private IWindowManager mWindowManager;
private IBackupManager mBackupManager; private IBackupManager mBackupManager;
@@ -97,6 +102,10 @@ public class DevelopmentSettings extends PreferenceFragment
private CheckBoxPreference mAllowMockLocation; private CheckBoxPreference mAllowMockLocation;
private PreferenceScreen mPassword; private PreferenceScreen mPassword;
private String mDebugApp;
private Preference mDebugAppPref;
private CheckBoxPreference mWaitForDebugger;
private CheckBoxPreference mStrictMode; private CheckBoxPreference mStrictMode;
private CheckBoxPreference mPointerLocation; private CheckBoxPreference mPointerLocation;
private CheckBoxPreference mShowTouches; private CheckBoxPreference mShowTouches;
@@ -144,10 +153,15 @@ public class DevelopmentSettings extends PreferenceFragment
mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD); mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD);
mAllPrefs.add(mPassword); mAllPrefs.add(mPassword);
mDebugAppPref = findPreference(DEBUG_APP_KEY);
mAllPrefs.add(mDebugAppPref);
mWaitForDebugger = (CheckBoxPreference) findPreference(WAIT_FOR_DEBUGGER_KEY);
mAllPrefs.add(mWaitForDebugger);
mResetCbPrefs.add(mWaitForDebugger);
mStrictMode = (CheckBoxPreference) findPreference(STRICT_MODE_KEY); mStrictMode = (CheckBoxPreference) findPreference(STRICT_MODE_KEY);
mAllPrefs.add(mStrictMode); mAllPrefs.add(mStrictMode);
mResetCbPrefs.add(mStrictMode); mResetCbPrefs.add(mStrictMode);
mResetCbPrefs.add(mAllowMockLocation);
mPointerLocation = (CheckBoxPreference) findPreference(POINTER_LOCATION_KEY); mPointerLocation = (CheckBoxPreference) findPreference(POINTER_LOCATION_KEY);
mAllPrefs.add(mPointerLocation); mAllPrefs.add(mPointerLocation);
mResetCbPrefs.add(mPointerLocation); mResetCbPrefs.add(mPointerLocation);
@@ -251,6 +265,7 @@ public class DevelopmentSettings extends PreferenceFragment
for (int i=0; i<mAllPrefs.size(); i++) { for (int i=0; i<mAllPrefs.size(); i++) {
mAllPrefs.get(i).setEnabled(enabled); mAllPrefs.get(i).setEnabled(enabled);
} }
updateAllOptions();
} }
@Override @Override
@@ -262,7 +277,6 @@ public class DevelopmentSettings extends PreferenceFragment
Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
mEnabledSwitch.setChecked(mLastEnabledState); mEnabledSwitch.setChecked(mLastEnabledState);
setPrefsEnabledState(mLastEnabledState); setPrefsEnabledState(mLastEnabledState);
updateAllOptions();
} }
private void updateAllOptions() { private void updateAllOptions() {
@@ -275,6 +289,7 @@ public class DevelopmentSettings extends PreferenceFragment
Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0); Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0);
updateHdcpValues(); updateHdcpValues();
updatePasswordSummary(); updatePasswordSummary();
updateDebuggerOptions();
updateStrictModeVisualOptions(); updateStrictModeVisualOptions();
updatePointerLocationOptions(); updatePointerLocationOptions();
updateShowTouchesOptions(); updateShowTouchesOptions();
@@ -295,6 +310,7 @@ public class DevelopmentSettings extends PreferenceFragment
onPreferenceTreeClick(null, cb); onPreferenceTreeClick(null, cb);
} }
} }
resetDebuggerOptions();
writeAnimationScaleOption(0, mWindowAnimationScale, null); writeAnimationScaleOption(0, mWindowAnimationScale, null);
writeAnimationScaleOption(1, mTransitionAnimationScale, null); writeAnimationScaleOption(1, mTransitionAnimationScale, null);
writeAnimationScaleOption(2, mAnimatorDurationScale, null); writeAnimationScaleOption(2, mAnimatorDurationScale, null);
@@ -333,6 +349,45 @@ public class DevelopmentSettings extends PreferenceFragment
} }
} }
private void writeDebuggerOptions() {
try {
ActivityManagerNative.getDefault().setDebugApp(
mDebugApp, mWaitForDebugger.isChecked(), true);
} catch (RemoteException ex) {
}
}
private void resetDebuggerOptions() {
try {
ActivityManagerNative.getDefault().setDebugApp(
null, false, true);
} catch (RemoteException ex) {
}
}
private void updateDebuggerOptions() {
mDebugApp = Settings.System.getString(
getActivity().getContentResolver(), Settings.System.DEBUG_APP);
mWaitForDebugger.setChecked(Settings.System.getInt(
getActivity().getContentResolver(), Settings.System.WAIT_FOR_DEBUGGER, 0) != 0);
if (mDebugApp != null && mDebugApp.length() > 0) {
String label;
try {
ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mDebugApp,
PackageManager.GET_DISABLED_COMPONENTS);
CharSequence lab = getActivity().getPackageManager().getApplicationLabel(ai);
label = lab != null ? lab.toString() : mDebugApp;
} catch (PackageManager.NameNotFoundException e) {
label = mDebugApp;
}
mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_set, label));
mWaitForDebugger.setEnabled(true);
} else {
mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_not_set));
mWaitForDebugger.setEnabled(false);
}
}
// Returns the current state of the system property that controls // Returns the current state of the system property that controls
// strictmode flashes. One of: // strictmode flashes. One of:
// 0: not explicitly set one way or another // 0: not explicitly set one way or another
@@ -575,6 +630,19 @@ public class DevelopmentSettings extends PreferenceFragment
} }
} }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_DEBUG_APP) {
if (resultCode == Activity.RESULT_OK) {
mDebugApp = data.getAction();
writeDebuggerOptions();
updateDebuggerOptions();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override @Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
@@ -607,6 +675,10 @@ public class DevelopmentSettings extends PreferenceFragment
Settings.Secure.putInt(getActivity().getContentResolver(), Settings.Secure.putInt(getActivity().getContentResolver(),
Settings.Secure.ALLOW_MOCK_LOCATION, Settings.Secure.ALLOW_MOCK_LOCATION,
mAllowMockLocation.isChecked() ? 1 : 0); mAllowMockLocation.isChecked() ? 1 : 0);
} else if (preference == mDebugAppPref) {
startActivityForResult(new Intent(getActivity(), AppPicker.class), RESULT_DEBUG_APP);
} else if (preference == mWaitForDebugger) {
writeDebuggerOptions();
} else if (preference == mStrictMode) { } else if (preference == mStrictMode) {
writeStrictModeVisualOptions(); writeStrictModeVisualOptions();
} else if (preference == mPointerLocation) { } else if (preference == mPointerLocation) {

View File

@@ -0,0 +1,64 @@
package com.android.settings.applications;
import com.android.settings.R;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
// View Holder used when displaying views
public class AppViewHolder {
public ApplicationsState.AppEntry entry;
public View rootView;
public TextView appName;
public ImageView appIcon;
public TextView appSize;
public TextView disabled;
public CheckBox checkBox;
static public AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.manage_applications_item, null);
// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
AppViewHolder holder = new AppViewHolder();
holder.rootView = convertView;
holder.appName = (TextView) convertView.findViewById(R.id.app_name);
holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.app_on_sdcard);
convertView.setTag(holder);
return holder;
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
return (AppViewHolder)convertView.getTag();
}
}
void updateSizeText(ManageApplications ma, int whichSize) {
if (ManageApplications.DEBUG) Log.i(ManageApplications.TAG, "updateSizeText of " + entry.label + " " + entry
+ ": " + entry.sizeStr);
if (entry.sizeStr != null) {
switch (whichSize) {
case ManageApplications.SIZE_INTERNAL:
appSize.setText(entry.internalSizeStr);
break;
case ManageApplications.SIZE_EXTERNAL:
appSize.setText(entry.externalSizeStr);
break;
default:
appSize.setText(entry.sizeStr);
break;
}
} else if (entry.size == ApplicationsState.SIZE_INVALID) {
appSize.setText(ma.mInvalidSizeStr);
}
}
}

View File

@@ -148,7 +148,7 @@ public class ManageApplications extends Fragment implements
private ApplicationsAdapter mApplicationsAdapter; private ApplicationsAdapter mApplicationsAdapter;
// Size resource used for packages whose size computation failed for some reason // Size resource used for packages whose size computation failed for some reason
private CharSequence mInvalidSizeStr; CharSequence mInvalidSizeStr;
private CharSequence mComputingSizeStr; private CharSequence mComputingSizeStr;
// layout inflater object used to inflate views // layout inflater object used to inflate views
@@ -205,36 +205,6 @@ public class ManageApplications extends Fragment implements
} }
}; };
// View Holder used when displaying views
static class AppViewHolder {
ApplicationsState.AppEntry entry;
TextView appName;
ImageView appIcon;
TextView appSize;
TextView disabled;
CheckBox checkBox;
void updateSizeText(ManageApplications ma, int whichSize) {
if (DEBUG) Log.i(TAG, "updateSizeText of " + entry.label + " " + entry
+ ": " + entry.sizeStr);
if (entry.sizeStr != null) {
switch (whichSize) {
case SIZE_INTERNAL:
appSize.setText(entry.internalSizeStr);
break;
case SIZE_EXTERNAL:
appSize.setText(entry.externalSizeStr);
break;
default:
appSize.setText(entry.sizeStr);
break;
}
} else if (entry.size == ApplicationsState.SIZE_INVALID) {
appSize.setText(ma.mInvalidSizeStr);
}
}
}
/* /*
* Custom adapter implementation for the ListView * Custom adapter implementation for the ListView
* This adapter maintains a map for each displayed application and its properties * This adapter maintains a map for each displayed application and its properties
@@ -477,28 +447,8 @@ public class ManageApplications extends Fragment implements
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unnecessary calls // A ViewHolder keeps references to children views to avoid unnecessary calls
// to findViewById() on each row. // to findViewById() on each row.
AppViewHolder holder; AppViewHolder holder = AppViewHolder.createOrRecycle(mInflater, convertView);
convertView = holder.rootView;
// When convertView is not null, we can reuse it directly, there is no need
// to reinflate it. We only inflate a new View when the convertView supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.manage_applications_item, null);
// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new AppViewHolder();
holder.appName = (TextView) convertView.findViewById(R.id.app_name);
holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.app_on_sdcard);
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (AppViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder // Bind the data efficiently with the holder
ApplicationsState.AppEntry entry = mEntries.get(position); ApplicationsState.AppEntry entry = mEntries.get(position);