diff --git a/F-Droid/res/layout/select_local_apps_activity.xml b/F-Droid/res/layout/select_local_apps_activity.xml deleted file mode 100644 index 745c0c176..000000000 --- a/F-Droid/res/layout/select_local_apps_activity.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/F-Droid/src/org/fdroid/fdroid/views/LocalRepoActivity.java b/F-Droid/src/org/fdroid/fdroid/views/LocalRepoActivity.java deleted file mode 100644 index 6a5697392..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/LocalRepoActivity.java +++ /dev/null @@ -1,338 +0,0 @@ -package org.fdroid.fdroid.views; - -import android.annotation.TargetApi; -import android.app.Dialog; -import android.app.ProgressDialog; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.Uri; -import android.net.wifi.WifiManager; -import android.nfc.NdefMessage; -import android.nfc.NdefRecord; -import android.nfc.NfcAdapter; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v7.app.ActionBarActivity; -import android.text.TextUtils; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.TextView; -import android.widget.Toast; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.PreferencesActivity; -import org.fdroid.fdroid.QrGenAsyncTask; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.localrepo.LocalRepoManager; -import org.fdroid.fdroid.localrepo.LocalRepoService; -import org.fdroid.fdroid.net.WifiStateChangeService; - -import java.util.Locale; -import java.util.Timer; -import java.util.TimerTask; - -public class LocalRepoActivity extends ActionBarActivity { - - private static final String TAG = "LocalRepoActivity"; - private ProgressDialog repoProgress; - - private WifiManager wifiManager; - private Button enableWifiButton; - private CheckBox repoSwitch; - - private Timer stopTimer; - - private final int SET_IP_ADDRESS = 7345; - private final int UPDATE_REPO = 7346; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - ((FDroidApp) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); - setContentView(R.layout.local_repo_activity); - - enableWifiButton = (Button) findViewById(R.id.enable_wifi); - repoSwitch = (CheckBox) findViewById(R.id.repoSwitch); - wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); - } - - @Override - public void onResume() { - super.onResume(); - resetNetworkInfo(); - setRepoSwitchChecked(FDroidApp.isLocalRepoServiceRunning()); - - LocalBroadcastManager.getInstance(this).registerReceiver(onWifiChange, - new IntentFilter(WifiStateChangeService.BROADCAST)); - LocalBroadcastManager.getInstance(this).registerReceiver(onLocalRepoChange, - new IntentFilter(LocalRepoService.STATE)); - // if no local repo exists, create one with only FDroid in it - if (!LocalRepoManager.get(this).xmlIndex.exists()) - new UpdateAsyncTask(this, new String[] { - getPackageName(), - }).execute(); - - // start repo by default - FDroidApp.startLocalRepoService(LocalRepoActivity.this); - // reset the timer if viewing this Activity again - if (stopTimer != null) - stopTimer.cancel(); - // automatically turn off after 15 minutes - stopTimer = new Timer(); - stopTimer.schedule(new TimerTask() { - - @Override - public void run() { - FDroidApp.stopLocalRepoService(LocalRepoActivity.this); - } - }, 900000); // 15 minutes - } - - @Override - public void onPause() { - super.onPause(); - LocalBroadcastManager.getInstance(this).unregisterReceiver(onWifiChange); - LocalBroadcastManager.getInstance(this).unregisterReceiver(onLocalRepoChange); - } - - private final BroadcastReceiver onWifiChange = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent i) { - resetNetworkInfo(); - } - }; - - private final BroadcastReceiver onLocalRepoChange = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent i) { - String state = i.getStringExtra(LocalRepoService.STATE); - if (state != null && state.equals(LocalRepoService.STARTED)) - setRepoSwitchChecked(true); - else - setRepoSwitchChecked(false); - } - }; - - private void resetNetworkInfo() { - int wifiState = wifiManager.getWifiState(); - if (wifiState == WifiManager.WIFI_STATE_ENABLED) { - setUIFromWifi(); - wireRepoSwitchToWebServer(); - repoSwitch.setVisibility(View.VISIBLE); - enableWifiButton.setVisibility(View.GONE); - } else { - repoSwitch.setChecked(false); - repoSwitch.setVisibility(View.GONE); - enableWifiButton.setVisibility(View.VISIBLE); - enableWifiButton.setText(R.string.enable_wifi); - enableWifiButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - enableWifiButton.setText(R.string.enabling_wifi); - wifiManager.setWifiEnabled(true); - /* - * Once the wifi is connected to a network, then - * WifiStateChangeReceiver will receive notice, and kick off - * the process of getting the info about the wifi - * connection. - */ - } - }); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.local_repo_activity, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_setup_repo: - startActivityForResult(new Intent(this, SelectLocalAppsActivity.class), UPDATE_REPO); - return true; - case R.id.menu_send_fdroid_via_wifi: - startActivity(new Intent(this, QrWizardWifiNetworkActivity.class)); - return true; - case R.id.menu_settings: - startActivityForResult(new Intent(this, PreferencesActivity.class), SET_IP_ADDRESS); - return true; - } - return false; - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode != RESULT_OK) - return; - if (requestCode == SET_IP_ADDRESS) { - setUIFromWifi(); - } else if (requestCode == UPDATE_REPO) { - setUIFromWifi(); - new UpdateAsyncTask(this, FDroidApp.selectedApps.toArray(new String[FDroidApp.selectedApps.size()])) - .execute(); - } - } - - @Override - protected Dialog onCreateDialog(int id) { - switch (id) { - case 0: - repoProgress = new ProgressDialog(this); - repoProgress.setMessage("Scanning Apps. Please wait..."); - repoProgress.setIndeterminate(false); - repoProgress.setMax(100); - repoProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - repoProgress.setCancelable(false); - repoProgress.show(); - return repoProgress; - default: - return null; - } - } - - private void wireRepoSwitchToWebServer() { - repoSwitch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - setRepoSwitchChecked(repoSwitch.isChecked()); - if (repoSwitch.isChecked()) { - FDroidApp.startLocalRepoService(LocalRepoActivity.this); - } else { - FDroidApp.stopLocalRepoService(LocalRepoActivity.this); - stopTimer.cancel(); // disable automatic stop - } - } - }); - } - - private void setRepoSwitchChecked(boolean checked) { - repoSwitch.setChecked(checked); - if (checked) { - repoSwitch.setText(R.string.local_repo_running); - } else { - repoSwitch.setText(R.string.touch_to_turn_on_local_repo); - } - } - - @TargetApi(14) - private void setUIFromWifi() { - if (TextUtils.isEmpty(FDroidApp.repo.address)) - return; - // the fingerprint is not useful on the button label - String buttonLabel = FDroidApp.repo.address.replaceAll("\\?.*$", ""); - TextView sharingUriTextView = (TextView) findViewById(R.id.sharing_uri); - sharingUriTextView.setText(buttonLabel); - /* - * Set URL to UPPER for compact QR Code, FDroid will translate it back. - * Remove the SSID from the query string since SSIDs are case-sensitive. - * Instead the receiver will have to rely on the BSSID to find the right - * wifi AP to join. Lots of QR Scanners are buggy and do not respect - * custom URI schemes, so we have to use http:// or https:// :-( - */ - final String qrUriString = Utils.getSharingUri(FDroidApp.repo).toString() - .replaceFirst("fdroidrepo", "http") - .replaceAll("ssid=[^?]*", "") - .toUpperCase(Locale.ENGLISH); - if (Build.VERSION.SDK_INT >= 8) // zxing requires >= 8 - new QrGenAsyncTask(this, R.id.repoQrCode).execute(qrUriString); - - TextView wifiNetworkNameTextView = (TextView) findViewById(R.id.wifi_network); - wifiNetworkNameTextView.setText(FDroidApp.ssid); - - TextView fingerprintTextView = (TextView) findViewById(R.id.fingerprint); - if (FDroidApp.repo.fingerprint != null) { - fingerprintTextView.setVisibility(View.VISIBLE); - fingerprintTextView.setText(FDroidApp.repo.fingerprint); - } else { - fingerprintTextView.setVisibility(View.GONE); - } - - // the required NFC API was added in 4.0 aka Ice Cream Sandwich - if (Build.VERSION.SDK_INT >= 14) { - NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); - if (nfcAdapter == null) - return; - nfcAdapter.setNdefPushMessage(new NdefMessage(new NdefRecord[] { - NdefRecord.createUri(Utils.getSharingUri(FDroidApp.repo)), - }), this); - } - } - - class UpdateAsyncTask extends AsyncTask { - private static final String TAG = "LocalRepoActivity.UpdateAsyncTask"; - private final ProgressDialog progressDialog; - private final String[] selectedApps; - private final Uri sharingUri; - - public UpdateAsyncTask(Context c, String[] apps) { - selectedApps = apps; - progressDialog = new ProgressDialog(c); - progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - progressDialog.setTitle(R.string.updating); - sharingUri = Utils.getSharingUri(FDroidApp.repo); - } - - @Override - protected void onPreExecute() { - progressDialog.show(); - } - - @Override - protected Void doInBackground(Void... params) { - try { - final LocalRepoManager lrm = LocalRepoManager.get(LocalRepoActivity.this); - publishProgress(getString(R.string.deleting_repo)); - lrm.deleteRepo(); - for (String app : selectedApps) { - publishProgress(String.format(getString(R.string.adding_apks_format), app)); - lrm.addApp(getApplicationContext(), app); - } - lrm.writeIndexPage(sharingUri.toString()); - publishProgress(getString(R.string.writing_index_jar)); - lrm.writeIndexJar(); - publishProgress(getString(R.string.linking_apks)); - lrm.copyApksToRepo(); - publishProgress(getString(R.string.copying_icons)); - // run the icon copy without progress, its not a blocker - new AsyncTask() { - - @Override - protected Void doInBackground(Void... params) { - lrm.copyIconsToRepo(); - return null; - } - }.execute(); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - @Override - protected void onProgressUpdate(String... progress) { - super.onProgressUpdate(progress); - progressDialog.setMessage(progress[0]); - } - - @Override - protected void onPostExecute(Void result) { - progressDialog.dismiss(); - Toast.makeText(getBaseContext(), R.string.updated_local_repo, Toast.LENGTH_SHORT) - .show(); - } - } -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java b/F-Droid/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java deleted file mode 100644 index 334544bf7..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.fdroid.fdroid.views; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Build; -import android.os.Bundle; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v7.app.ActionBarActivity; -import android.util.Log; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.TextView; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.Preferences; -import org.fdroid.fdroid.QrGenAsyncTask; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.net.WifiStateChangeService; - -public class QrWizardDownloadActivity extends ActionBarActivity { - - private static final String TAG = "QrWizardDownloadActivity"; - - @Override - public void onCreate(Bundle savedInstanceState) { - ((FDroidApp) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); - setContentView(R.layout.qr_wizard_activity); - TextView instructions = (TextView) findViewById(R.id.qrWizardInstructions); - instructions.setText(R.string.qr_wizard_download_instructions); - Button next = (Button) findViewById(R.id.qrNextButton); - next.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - setResult(RESULT_OK); - finish(); - } - }); - } - - @Override - public void onResume() { - super.onResume(); - resetNetworkInfo(); - LocalBroadcastManager.getInstance(this).registerReceiver(onWifiChange, - new IntentFilter(WifiStateChangeService.BROADCAST)); - } - - @Override - public void onPause() { - super.onPause(); - LocalBroadcastManager.getInstance(this).unregisterReceiver(onWifiChange); - } - - private final BroadcastReceiver onWifiChange = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent i) { - Log.i(TAG, "onWifiChange.onReceive()"); - resetNetworkInfo(); - } - }; - - private void resetNetworkInfo() { - String qrString = ""; - if (Preferences.get().isLocalRepoHttpsEnabled()) - qrString += "https"; - else - qrString += "http"; - qrString += "://" + FDroidApp.ipAddressString; - qrString += ":" + FDroidApp.port; - - if (Build.VERSION.SDK_INT >= 8) // zxing requires >= 8 - new QrGenAsyncTask(this, R.id.qrWizardImage).execute(qrString); - Log.i(TAG, "qr: " + qrString); - - TextView wifiNetworkName = (TextView) findViewById(R.id.qrWifiNetworkName); - wifiNetworkName.setText(qrString.replaceFirst("http://", "")); - } -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java b/F-Droid/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java deleted file mode 100644 index 81cd6d71f..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.fdroid.fdroid.views; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.wifi.WifiInfo; -import android.net.wifi.WifiManager; -import android.os.Build; -import android.os.Bundle; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v7.app.ActionBarActivity; -import android.util.Log; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.TextView; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.QrGenAsyncTask; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.net.WifiStateChangeService; - -public class QrWizardWifiNetworkActivity extends ActionBarActivity { - private static final String TAG = "QrWizardWifiNetworkActivity"; - - private WifiManager wifiManager; - - @Override - public void onCreate(Bundle savedInstanceState) { - ((FDroidApp) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); - - wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); - wifiManager.setWifiEnabled(true); - FDroidApp.startLocalRepoService(this); - - setContentView(R.layout.qr_wizard_activity); - TextView instructions = (TextView) findViewById(R.id.qrWizardInstructions); - instructions.setText(R.string.qr_wizard_wifi_network_instructions); - Button next = (Button) findViewById(R.id.qrNextButton); - next.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - Intent intent = new Intent(getBaseContext(), QrWizardDownloadActivity.class); - startActivityForResult(intent, 0); - finish(); - } - }); - } - - @Override - public void onResume() { - super.onResume(); - resetNetworkInfo(); - LocalBroadcastManager.getInstance(this).registerReceiver(onWifiChange, - new IntentFilter(WifiStateChangeService.BROADCAST)); - } - - @Override - public void onPause() { - super.onPause(); - LocalBroadcastManager.getInstance(this).unregisterReceiver(onWifiChange); - } - - private final BroadcastReceiver onWifiChange = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent i) { - Log.i(TAG, "onWifiChange.onReceive()"); - resetNetworkInfo(); - } - }; - - private void resetNetworkInfo() { - int wifiState = wifiManager.getWifiState(); - if (wifiState == WifiManager.WIFI_STATE_ENABLED) { - WifiInfo wifiInfo = wifiManager.getConnectionInfo(); - // http://zxing.appspot.com/generator/ - // WIFI:S:openwireless.org;; // no pw - // WIFI:S:openwireless.org;T:WPA;; - // WIFI:S:openwireless.org;T:WEP;; - // WIFI:S:openwireless.org;H:true;; // hidden - // WIFI:S:openwireless.org;T:WPA;H:true;; // all - String qrString = "WIFI:S:"; - qrString += wifiInfo.getSSID(); - // TODO get encryption state (none, WEP, WPA) - /* - * WifiConfiguration wc = null; for (WifiConfiguration i : - * wifiManager.getConfiguredNetworks()) { if (i.status == - * WifiConfiguration.Status.CURRENT) { wc = i; break; } } if (wc != - * null) - */ - if (wifiInfo.getHiddenSSID()) - qrString += ";H:true"; - qrString += ";;"; - if (Build.VERSION.SDK_INT >= 8) // zxing requires >= 8 - new QrGenAsyncTask(this, R.id.qrWizardImage).execute(qrString); - - TextView wifiNetworkName = (TextView) findViewById(R.id.qrWifiNetworkName); - wifiNetworkName.setText(wifiInfo.getSSID()); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - // this wizard is done, clear this Activity from the history - if (resultCode == RESULT_OK) - finish(); - } -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java b/F-Droid/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java deleted file mode 100644 index c491e7bc6..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.fdroid.fdroid.views; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.view.MenuItemCompat; -import android.support.v7.app.ActionBarActivity; -import android.support.v7.view.ActionMode; -import android.support.v7.widget.SearchView; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.PreferencesActivity; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.SelectLocalAppsFragment; - -public class SelectLocalAppsActivity extends ActionBarActivity { - - private static final String TAG = "SelectLocalAppsActivity"; - private SelectLocalAppsFragment selectLocalAppsFragment = null; - private SearchView searchView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - ((FDroidApp) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); - setContentView(R.layout.select_local_apps_activity); - } - - @Override - protected void onResume() { - super.onResume(); - if (selectLocalAppsFragment == null) - selectLocalAppsFragment = (SelectLocalAppsFragment) getSupportFragmentManager() - .findFragmentById(R.id.fragment_app_list); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.select_local_apps_activity, menu); - searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); - searchView.setOnQueryTextListener(selectLocalAppsFragment); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - setResult(RESULT_CANCELED); - finish(); - return true; - case R.id.action_settings: - startActivity(new Intent(this, PreferencesActivity.class)); - return true; - } - return super.onOptionsItemSelected(item); - } - - public final ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { - - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - MenuInflater inflater = mode.getMenuInflater(); - inflater.inflate(R.menu.select_local_apps_action_mode, menu); - return true; - } - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return false; // Return false if nothing is done - } - - @Override - public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { - switch (item.getItemId()) { - case R.id.action_update_repo: - setResult(RESULT_OK); - finish(); - return true; - default: - return false; - } - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - setResult(RESULT_CANCELED); - finish(); - } - }; -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java deleted file mode 100644 index 5f492a8a5..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - 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 org.fdroid.fdroid.views.fragments; - -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.support.v4.app.ListFragment; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.CursorLoader; -import android.support.v4.content.Loader; -import android.support.v4.widget.SimpleCursorAdapter; -import android.support.v4.widget.SimpleCursorAdapter.ViewBinder; -import android.support.v7.view.ActionMode; -import android.support.v7.widget.SearchView.OnQueryTextListener; -import android.text.TextUtils; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.data.InstalledAppProvider; -import org.fdroid.fdroid.data.InstalledAppProvider.DataColumns; -import org.fdroid.fdroid.localrepo.LocalRepoManager; -import org.fdroid.fdroid.views.SelectLocalAppsActivity; - -import java.util.HashSet; -import java.util.Set; - -public class SelectLocalAppsFragment extends ListFragment - implements LoaderManager.LoaderCallbacks, OnQueryTextListener { - - private PackageManager packageManager; - private Drawable defaultAppIcon; - private SelectLocalAppsActivity selectLocalAppsActivity; - private ActionMode mActionMode = null; - private String mCurrentFilterString; - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - setEmptyText(getString(R.string.no_applications_found)); - - packageManager = getActivity().getPackageManager(); - defaultAppIcon = getActivity().getResources() - .getDrawable(android.R.drawable.sym_def_app_icon); - - selectLocalAppsActivity = (SelectLocalAppsActivity) getActivity(); - ListView listView = getListView(); - listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); - SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), - R.layout.select_local_apps_list_item, - null, - new String[] { - InstalledAppProvider.DataColumns.APPLICATION_LABEL, - InstalledAppProvider.DataColumns.APP_ID, - }, - new int[] { - R.id.application_label, - R.id.package_name, - }, - 0); - adapter.setViewBinder(new ViewBinder() { - - @Override - public boolean setViewValue(View view, Cursor cursor, int columnIndex) { - if (columnIndex == cursor.getColumnIndex(InstalledAppProvider.DataColumns.APP_ID)) { - String packageName = cursor.getString(columnIndex); - TextView textView = (TextView) view.findViewById(R.id.package_name); - textView.setText(packageName); - LinearLayout ll = (LinearLayout) view.getParent().getParent(); - ImageView iconView = (ImageView) ll.getChildAt(0); - Drawable icon; - try { - icon = packageManager.getApplicationIcon(packageName); - } catch (PackageManager.NameNotFoundException e) { - icon = defaultAppIcon; - } - iconView.setImageDrawable(icon); - return true; - } - return false; - } - }); - setListAdapter(adapter); - setListShown(false); // start out with a progress indicator - - // either reconnect with an existing loader or start a new one - getLoaderManager().initLoader(0, null, this); - - // build list of existing apps from what is on the file system - if (FDroidApp.selectedApps == null) { - Set selectedApps = new HashSet<>(); - for (String filename : LocalRepoManager.get(selectLocalAppsActivity).repoDir.list()) { - if (filename.matches(".*\\.apk")) { - String packageName = filename.substring(0, filename.indexOf("_")); - selectedApps.add(packageName); - } - } - FDroidApp.selectedApps = selectedApps; - } - } - - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - if (mActionMode == null) - mActionMode = selectLocalAppsActivity - .startSupportActionMode(selectLocalAppsActivity.mActionModeCallback); - Cursor c = (Cursor) getListAdapter().getItem(position); - String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID)); - if (FDroidApp.selectedApps.contains(packageName)) { - FDroidApp.selectedApps.remove(packageName); - } else { - FDroidApp.selectedApps.add(packageName); - } - } - - @Override - public CursorLoader onCreateLoader(int id, Bundle args) { - Uri baseUri; - if (TextUtils.isEmpty(mCurrentFilterString)) { - baseUri = InstalledAppProvider.getContentUri(); - } else { - baseUri = InstalledAppProvider.getSearchUri(mCurrentFilterString); - } - return new CursorLoader( - this.getActivity(), - baseUri, - InstalledAppProvider.DataColumns.ALL, - null, - null, - InstalledAppProvider.DataColumns.APPLICATION_LABEL); - } - - @Override - public void onLoadFinished(Loader loader, Cursor cursor) { - SimpleCursorAdapter adapter = (SimpleCursorAdapter) getListAdapter(); - adapter.swapCursor(cursor); - - ListView listView = getListView(); - int count = listView.getCount(); - String fdroid = loader.getContext().getPackageName(); - for (int i = 0; i < count; i++) { - Cursor c = ((Cursor) listView.getItemAtPosition(i)); - String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID)); - if (TextUtils.equals(packageName, fdroid)) { - listView.setItemChecked(i, true); // always include FDroid - } else { - for (String selected : FDroidApp.selectedApps) { - if (TextUtils.equals(packageName, selected)) { - listView.setItemChecked(i, true); - } - } - } - } - - if (isResumed()) { - setListShown(true); - } else { - setListShownNoAnimation(true); - } - } - - @Override - public void onLoaderReset(Loader loader) { - SimpleCursorAdapter adapter = (SimpleCursorAdapter) getListAdapter(); - adapter.swapCursor(null); - } - - @Override - public boolean onQueryTextChange(String newText) { - String newFilter = !TextUtils.isEmpty(newText) ? newText : null; - if (mCurrentFilterString == null && newFilter == null) { - return true; - } - if (mCurrentFilterString != null && mCurrentFilterString.equals(newFilter)) { - return true; - } - mCurrentFilterString = newFilter; - getLoaderManager().restartLoader(0, null, this); - return true; - } - - @Override - public boolean onQueryTextSubmit(String query) { - // this is not needed since we respond to every change in text - return true; - } - - public String getCurrentFilterString() { - return mCurrentFilterString; - } -}