Formatting fixes only - seems I had the wrong settings on one of my machines at some point
This commit is contained in:
parent
c629a6884f
commit
3aa6d5a7a9
File diff suppressed because it is too large
Load Diff
@ -60,423 +60,423 @@ import android.widget.TabHost.TabSpec;
|
||||
|
||||
public class FDroid extends TabActivity implements OnItemClickListener {
|
||||
|
||||
private class AppListAdapter extends BaseAdapter {
|
||||
|
||||
private List<DB.App> items = new ArrayList<DB.App>();
|
||||
|
||||
public AppListAdapter(Context context) {
|
||||
}
|
||||
|
||||
public void addItem(DB.App app) {
|
||||
items.add(app);
|
||||
}
|
||||
private class AppListAdapter extends BaseAdapter {
|
||||
|
||||
private List<DB.App> items = new ArrayList<DB.App>();
|
||||
|
||||
public AppListAdapter(Context context) {
|
||||
}
|
||||
|
||||
public void addItem(DB.App app) {
|
||||
items.add(app);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
items.clear();
|
||||
}
|
||||
public void clear() {
|
||||
items.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return items.size();
|
||||
}
|
||||
@Override
|
||||
public int getCount() {
|
||||
return items.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return items.get(position);
|
||||
}
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return items.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View v = convertView;
|
||||
if (v == null) {
|
||||
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
v = vi.inflate(R.layout.applistitem, null);
|
||||
}
|
||||
DB.App app = items.get(position);
|
||||
|
||||
TextView name = (TextView) v.findViewById(R.id.name);
|
||||
name.setText(app.name);
|
||||
|
||||
String vs;
|
||||
int numav = app.apks.size();
|
||||
if (numav == 1)
|
||||
vs = getString(R.string.n_version_available);
|
||||
else
|
||||
vs = getString(R.string.n_versions_available);
|
||||
TextView status = (TextView) v.findViewById(R.id.status);
|
||||
status.setText(String.format(vs, numav));
|
||||
|
||||
TextView license = (TextView) v.findViewById(R.id.license);
|
||||
license.setText(app.license);
|
||||
|
||||
TextView summary = (TextView) v.findViewById(R.id.summary);
|
||||
summary.setText(app.summary);
|
||||
|
||||
ImageView icon = (ImageView) v.findViewById(R.id.icon);
|
||||
String iconpath = new String(DB.getIconsPath() + app.icon);
|
||||
File icn = new File(iconpath);
|
||||
if (icn.exists() && icn.length() > 0) {
|
||||
new Uri.Builder().build();
|
||||
icon.setImageURI(Uri.parse(iconpath));
|
||||
} else {
|
||||
icon.setImageResource(android.R.drawable.sym_def_app_icon);
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
private String LOCAL_PATH = "/sdcard/.fdroid";
|
||||
|
||||
private static final int REQUEST_APPDETAILS = 0;
|
||||
private static final int REQUEST_MANAGEREPOS = 1;
|
||||
private static final int REQUEST_PREFS = 2;
|
||||
|
||||
private static final int UPDATE_REPO = Menu.FIRST;
|
||||
private static final int MANAGE_REPO = Menu.FIRST + 1;
|
||||
private static final int PREFERENCES = Menu.FIRST + 2;
|
||||
private static final int ABOUT = Menu.FIRST + 3;
|
||||
|
||||
private DB db = null;
|
||||
|
||||
// Apps that are available to be installed
|
||||
private AppListAdapter apps_av = new AppListAdapter(this);
|
||||
|
||||
// Apps that are installed
|
||||
private AppListAdapter apps_in = new AppListAdapter(this);
|
||||
|
||||
// Apps that can be upgraded
|
||||
private AppListAdapter apps_up = new AppListAdapter(this);
|
||||
|
||||
private ProgressDialog pd;
|
||||
|
||||
private static final String TAB_IN = "INST";
|
||||
private static final String TAB_UN = "UNIN";
|
||||
private static final String TAB_UP = "UPDT";
|
||||
private TabHost tabHost;
|
||||
private TabSpec ts;
|
||||
private TabSpec ts1;
|
||||
private TabSpec tsUp;
|
||||
|
||||
private boolean triedEmptyUpdate;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.fdroid);
|
||||
|
||||
File local_path = new File(LOCAL_PATH);
|
||||
if (!local_path.exists())
|
||||
local_path.mkdir();
|
||||
|
||||
File icon_path = new File(DB.getIconsPath());
|
||||
if (!icon_path.exists())
|
||||
icon_path.mkdir();
|
||||
|
||||
tabHost = getTabHost();
|
||||
createTabs();
|
||||
|
||||
Intent i = getIntent();
|
||||
if (i.hasExtra("uri")) {
|
||||
Intent call = new Intent(this, ManageRepo.class);
|
||||
call.putExtra("uri", i.getStringExtra("uri"));
|
||||
startActivityForResult(call, REQUEST_MANAGEREPOS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
((FDroidApp) getApplication()).inActivity++;
|
||||
db = new DB(this);
|
||||
triedEmptyUpdate = false;
|
||||
populateLists(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
db.close();
|
||||
((FDroidApp) getApplication()).inActivity--;
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
|
||||
super.onCreateOptionsMenu(menu);
|
||||
menu.add(Menu.NONE, UPDATE_REPO, 1, R.string.menu_update_repo).setIcon(
|
||||
android.R.drawable.ic_menu_rotate);
|
||||
menu.add(Menu.NONE, MANAGE_REPO, 2, R.string.menu_manage).setIcon(
|
||||
android.R.drawable.ic_menu_agenda);
|
||||
menu.add(Menu.NONE, PREFERENCES, 3, R.string.menu_preferences).setIcon(
|
||||
android.R.drawable.ic_menu_preferences);
|
||||
menu.add(Menu.NONE, ABOUT, 4, R.string.menu_about).setIcon(
|
||||
android.R.drawable.ic_menu_help);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
|
||||
switch (item.getItemId()) {
|
||||
|
||||
case UPDATE_REPO:
|
||||
updateRepos();
|
||||
return true;
|
||||
|
||||
case MANAGE_REPO:
|
||||
Intent i = new Intent(this, ManageRepo.class);
|
||||
startActivityForResult(i, REQUEST_MANAGEREPOS);
|
||||
return true;
|
||||
|
||||
case PREFERENCES:
|
||||
Intent prefs = new Intent(getBaseContext(), Preferences.class);
|
||||
startActivityForResult(prefs, REQUEST_PREFS);
|
||||
return true;
|
||||
|
||||
case ABOUT:
|
||||
LayoutInflater li = LayoutInflater.from(this);
|
||||
View view = li.inflate(R.layout.about, null);
|
||||
|
||||
// Fill in the version...
|
||||
TextView tv = (TextView) view.findViewById(R.id.version);
|
||||
PackageManager pm = getPackageManager();
|
||||
PackageInfo pi;
|
||||
try {
|
||||
pi = pm.getPackageInfo(
|
||||
getApplicationContext().getPackageName(), 0);
|
||||
tv.setText(pi.versionName);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
Builder p = new AlertDialog.Builder(this).setView(view);
|
||||
final AlertDialog alrt = p.create();
|
||||
alrt.setIcon(R.drawable.icon);
|
||||
alrt.setTitle(getString(R.string.about_title));
|
||||
alrt.setButton(AlertDialog.BUTTON_NEUTRAL,
|
||||
getString(R.string.about_website),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
Uri uri = Uri.parse("http://f-droid.org");
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, uri));
|
||||
}
|
||||
});
|
||||
alrt.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.ok),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
}
|
||||
});
|
||||
alrt.show();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
|
||||
switch (requestCode) {
|
||||
case REQUEST_APPDETAILS:
|
||||
break;
|
||||
case REQUEST_MANAGEREPOS:
|
||||
if (data.hasExtra("update")) {
|
||||
AlertDialog.Builder ask_alrt = new AlertDialog.Builder(this);
|
||||
ask_alrt.setTitle(getString(R.string.repo_update_title));
|
||||
ask_alrt.setIcon(android.R.drawable.ic_menu_rotate);
|
||||
ask_alrt.setMessage(getString(R.string.repo_alrt));
|
||||
ask_alrt.setPositiveButton(getString(R.string.yes),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
updateRepos();
|
||||
}
|
||||
});
|
||||
ask_alrt.setNegativeButton(getString(R.string.no),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
AlertDialog alert = ask_alrt.create();
|
||||
alert.show();
|
||||
}
|
||||
break;
|
||||
case REQUEST_PREFS:
|
||||
// The automatic update settings may have changed, so reschedule (or
|
||||
// unschedule) the
|
||||
// service accordingly. It's cheap, so no need to check if the
|
||||
// particular setting has
|
||||
// actually been changed.
|
||||
UpdateService.schedule(getBaseContext());
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void createTabs() {
|
||||
tabHost.clearAllTabs();
|
||||
|
||||
// TabContentFactory that can generate the appropriate list for each
|
||||
// tab...
|
||||
TabHost.TabContentFactory tf = new TabHost.TabContentFactory() {
|
||||
@Override
|
||||
public View createTabContent(String tag) {
|
||||
|
||||
AppListAdapter ad;
|
||||
if (tag.equals(TAB_IN))
|
||||
ad = apps_in;
|
||||
else if (tag.equals(TAB_UP))
|
||||
ad = apps_up;
|
||||
else
|
||||
ad = apps_av;
|
||||
|
||||
ListView lst = new ListView(FDroid.this);
|
||||
lst.setOnItemClickListener(FDroid.this);
|
||||
lst.setAdapter(ad);
|
||||
return lst;
|
||||
}
|
||||
};
|
||||
|
||||
// Create the tab of installed apps...
|
||||
ts = tabHost.newTabSpec(TAB_IN);
|
||||
ts.setIndicator(getString(R.string.tab_installed), getResources()
|
||||
.getDrawable(drawable.star_off));
|
||||
ts.setContent(tf);
|
||||
|
||||
// Create the tab of apps with updates...
|
||||
tsUp = tabHost.newTabSpec(TAB_UP);
|
||||
tsUp.setIndicator(getString(R.string.tab_updates), getResources()
|
||||
.getDrawable(drawable.star_on));
|
||||
tsUp.setContent(tf);
|
||||
|
||||
// Create the tab of available apps...
|
||||
ts1 = tabHost.newTabSpec(TAB_UN);
|
||||
ts1.setIndicator(getString(R.string.tab_noninstalled), getResources()
|
||||
.getDrawable(drawable.ic_input_add));
|
||||
ts1.setContent(tf);
|
||||
|
||||
tabHost.addTab(ts1);
|
||||
tabHost.addTab(ts);
|
||||
tabHost.addTab(tsUp);
|
||||
|
||||
}
|
||||
|
||||
// Populate the lists.
|
||||
// 'update' - true to update the installed status of the applications
|
||||
// by asking the system.
|
||||
private void populateLists(boolean update) {
|
||||
|
||||
apps_in.clear();
|
||||
apps_av.clear();
|
||||
apps_up.clear();
|
||||
|
||||
Vector<DB.App> apps = db.getApps(null, null, update);
|
||||
if (apps.isEmpty()) {
|
||||
// Don't attempt this more than once - we may have invalid
|
||||
// repositories.
|
||||
if (triedEmptyUpdate)
|
||||
return;
|
||||
// If there are no apps, update from the repos - it must be a
|
||||
// new installation.
|
||||
Log.d("FDroid", "Empty app list forces repo update");
|
||||
updateRepos();
|
||||
triedEmptyUpdate = true;
|
||||
return;
|
||||
}
|
||||
Log.d("FDroid", "Updating lists - " + apps.size() + " apps in total");
|
||||
|
||||
for (DB.App app : apps) {
|
||||
if (app.installedVersion == null) {
|
||||
apps_av.addItem(app);
|
||||
} else {
|
||||
apps_in.addItem(app);
|
||||
if (app.hasUpdates)
|
||||
apps_up.addItem(app);
|
||||
}
|
||||
}
|
||||
|
||||
// Update the count on the 'Updates' tab to show the number available.
|
||||
// This is quite unpleasant, but seems to be the only way to do it.
|
||||
TextView uptext = (TextView) tabHost.getTabWidget().getChildAt(2)
|
||||
.findViewById(android.R.id.title);
|
||||
uptext.setText(getString(R.string.tab_updates) + " ("
|
||||
+ Integer.toString(apps_up.getCount()) + ")");
|
||||
|
||||
// Tell the lists that the data behind the adapter has changed, so
|
||||
// they can refresh...
|
||||
apps_av.notifyDataSetChanged();
|
||||
apps_in.notifyDataSetChanged();
|
||||
apps_up.notifyDataSetChanged();
|
||||
|
||||
}
|
||||
|
||||
public boolean updateRepos() {
|
||||
pd = ProgressDialog.show(this, getString(R.string.process_wait_title),
|
||||
getString(R.string.process_update_msg), true);
|
||||
pd.setIcon(android.R.drawable.ic_dialog_info);
|
||||
|
||||
// Check for connection first!
|
||||
ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
if (netstate.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED
|
||||
|| netstate.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED) {
|
||||
new Thread() {
|
||||
public void run() {
|
||||
RepoXMLHandler.doUpdates(FDroid.this, db);
|
||||
update_handler.sendEmptyMessage(0);
|
||||
}
|
||||
}.start();
|
||||
return true;
|
||||
} else {
|
||||
pd.dismiss();
|
||||
Toast.makeText(FDroid.this, getString(R.string.connection_error),
|
||||
Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Handlers for thread functions that need to access GUI
|
||||
*/
|
||||
private Handler update_handler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
populateLists(true);
|
||||
if (pd.isShowing())
|
||||
pd.dismiss();
|
||||
}
|
||||
};
|
||||
|
||||
// Handler for a click on one of the items in an application list. Pops
|
||||
// up a dialog that shows the details of the application and all its
|
||||
// available versions, with buttons to allow installation etc.
|
||||
public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2,
|
||||
long arg3) {
|
||||
|
||||
final DB.App app;
|
||||
String curtab = tabHost.getCurrentTabTag();
|
||||
if (curtab.equalsIgnoreCase(TAB_IN)) {
|
||||
app = (DB.App) apps_in.getItem(arg2);
|
||||
} else if (curtab.equalsIgnoreCase(TAB_UP)) {
|
||||
app = (DB.App) apps_up.getItem(arg2);
|
||||
} else {
|
||||
app = (DB.App) apps_av.getItem(arg2);
|
||||
}
|
||||
|
||||
Intent intent = new Intent(this, AppDetails.class);
|
||||
intent.putExtra("appid", app.id);
|
||||
startActivityForResult(intent, REQUEST_APPDETAILS);
|
||||
|
||||
}
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View v = convertView;
|
||||
if (v == null) {
|
||||
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
v = vi.inflate(R.layout.applistitem, null);
|
||||
}
|
||||
DB.App app = items.get(position);
|
||||
|
||||
TextView name = (TextView) v.findViewById(R.id.name);
|
||||
name.setText(app.name);
|
||||
|
||||
String vs;
|
||||
int numav = app.apks.size();
|
||||
if (numav == 1)
|
||||
vs = getString(R.string.n_version_available);
|
||||
else
|
||||
vs = getString(R.string.n_versions_available);
|
||||
TextView status = (TextView) v.findViewById(R.id.status);
|
||||
status.setText(String.format(vs, numav));
|
||||
|
||||
TextView license = (TextView) v.findViewById(R.id.license);
|
||||
license.setText(app.license);
|
||||
|
||||
TextView summary = (TextView) v.findViewById(R.id.summary);
|
||||
summary.setText(app.summary);
|
||||
|
||||
ImageView icon = (ImageView) v.findViewById(R.id.icon);
|
||||
String iconpath = new String(DB.getIconsPath() + app.icon);
|
||||
File icn = new File(iconpath);
|
||||
if (icn.exists() && icn.length() > 0) {
|
||||
new Uri.Builder().build();
|
||||
icon.setImageURI(Uri.parse(iconpath));
|
||||
} else {
|
||||
icon.setImageResource(android.R.drawable.sym_def_app_icon);
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
private String LOCAL_PATH = "/sdcard/.fdroid";
|
||||
|
||||
private static final int REQUEST_APPDETAILS = 0;
|
||||
private static final int REQUEST_MANAGEREPOS = 1;
|
||||
private static final int REQUEST_PREFS = 2;
|
||||
|
||||
private static final int UPDATE_REPO = Menu.FIRST;
|
||||
private static final int MANAGE_REPO = Menu.FIRST + 1;
|
||||
private static final int PREFERENCES = Menu.FIRST + 2;
|
||||
private static final int ABOUT = Menu.FIRST + 3;
|
||||
|
||||
private DB db = null;
|
||||
|
||||
// Apps that are available to be installed
|
||||
private AppListAdapter apps_av = new AppListAdapter(this);
|
||||
|
||||
// Apps that are installed
|
||||
private AppListAdapter apps_in = new AppListAdapter(this);
|
||||
|
||||
// Apps that can be upgraded
|
||||
private AppListAdapter apps_up = new AppListAdapter(this);
|
||||
|
||||
private ProgressDialog pd;
|
||||
|
||||
private static final String TAB_IN = "INST";
|
||||
private static final String TAB_UN = "UNIN";
|
||||
private static final String TAB_UP = "UPDT";
|
||||
private TabHost tabHost;
|
||||
private TabSpec ts;
|
||||
private TabSpec ts1;
|
||||
private TabSpec tsUp;
|
||||
|
||||
private boolean triedEmptyUpdate;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.fdroid);
|
||||
|
||||
File local_path = new File(LOCAL_PATH);
|
||||
if (!local_path.exists())
|
||||
local_path.mkdir();
|
||||
|
||||
File icon_path = new File(DB.getIconsPath());
|
||||
if (!icon_path.exists())
|
||||
icon_path.mkdir();
|
||||
|
||||
tabHost = getTabHost();
|
||||
createTabs();
|
||||
|
||||
Intent i = getIntent();
|
||||
if (i.hasExtra("uri")) {
|
||||
Intent call = new Intent(this, ManageRepo.class);
|
||||
call.putExtra("uri", i.getStringExtra("uri"));
|
||||
startActivityForResult(call, REQUEST_MANAGEREPOS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
((FDroidApp) getApplication()).inActivity++;
|
||||
db = new DB(this);
|
||||
triedEmptyUpdate = false;
|
||||
populateLists(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
db.close();
|
||||
((FDroidApp) getApplication()).inActivity--;
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
|
||||
super.onCreateOptionsMenu(menu);
|
||||
menu.add(Menu.NONE, UPDATE_REPO, 1, R.string.menu_update_repo).setIcon(
|
||||
android.R.drawable.ic_menu_rotate);
|
||||
menu.add(Menu.NONE, MANAGE_REPO, 2, R.string.menu_manage).setIcon(
|
||||
android.R.drawable.ic_menu_agenda);
|
||||
menu.add(Menu.NONE, PREFERENCES, 3, R.string.menu_preferences).setIcon(
|
||||
android.R.drawable.ic_menu_preferences);
|
||||
menu.add(Menu.NONE, ABOUT, 4, R.string.menu_about).setIcon(
|
||||
android.R.drawable.ic_menu_help);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
|
||||
switch (item.getItemId()) {
|
||||
|
||||
case UPDATE_REPO:
|
||||
updateRepos();
|
||||
return true;
|
||||
|
||||
case MANAGE_REPO:
|
||||
Intent i = new Intent(this, ManageRepo.class);
|
||||
startActivityForResult(i, REQUEST_MANAGEREPOS);
|
||||
return true;
|
||||
|
||||
case PREFERENCES:
|
||||
Intent prefs = new Intent(getBaseContext(), Preferences.class);
|
||||
startActivityForResult(prefs, REQUEST_PREFS);
|
||||
return true;
|
||||
|
||||
case ABOUT:
|
||||
LayoutInflater li = LayoutInflater.from(this);
|
||||
View view = li.inflate(R.layout.about, null);
|
||||
|
||||
// Fill in the version...
|
||||
TextView tv = (TextView) view.findViewById(R.id.version);
|
||||
PackageManager pm = getPackageManager();
|
||||
PackageInfo pi;
|
||||
try {
|
||||
pi = pm.getPackageInfo(
|
||||
getApplicationContext().getPackageName(), 0);
|
||||
tv.setText(pi.versionName);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
Builder p = new AlertDialog.Builder(this).setView(view);
|
||||
final AlertDialog alrt = p.create();
|
||||
alrt.setIcon(R.drawable.icon);
|
||||
alrt.setTitle(getString(R.string.about_title));
|
||||
alrt.setButton(AlertDialog.BUTTON_NEUTRAL,
|
||||
getString(R.string.about_website),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
Uri uri = Uri.parse("http://f-droid.org");
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, uri));
|
||||
}
|
||||
});
|
||||
alrt.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.ok),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
}
|
||||
});
|
||||
alrt.show();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
|
||||
switch (requestCode) {
|
||||
case REQUEST_APPDETAILS:
|
||||
break;
|
||||
case REQUEST_MANAGEREPOS:
|
||||
if (data.hasExtra("update")) {
|
||||
AlertDialog.Builder ask_alrt = new AlertDialog.Builder(this);
|
||||
ask_alrt.setTitle(getString(R.string.repo_update_title));
|
||||
ask_alrt.setIcon(android.R.drawable.ic_menu_rotate);
|
||||
ask_alrt.setMessage(getString(R.string.repo_alrt));
|
||||
ask_alrt.setPositiveButton(getString(R.string.yes),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
updateRepos();
|
||||
}
|
||||
});
|
||||
ask_alrt.setNegativeButton(getString(R.string.no),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
AlertDialog alert = ask_alrt.create();
|
||||
alert.show();
|
||||
}
|
||||
break;
|
||||
case REQUEST_PREFS:
|
||||
// The automatic update settings may have changed, so reschedule (or
|
||||
// unschedule) the
|
||||
// service accordingly. It's cheap, so no need to check if the
|
||||
// particular setting has
|
||||
// actually been changed.
|
||||
UpdateService.schedule(getBaseContext());
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void createTabs() {
|
||||
tabHost.clearAllTabs();
|
||||
|
||||
// TabContentFactory that can generate the appropriate list for each
|
||||
// tab...
|
||||
TabHost.TabContentFactory tf = new TabHost.TabContentFactory() {
|
||||
@Override
|
||||
public View createTabContent(String tag) {
|
||||
|
||||
AppListAdapter ad;
|
||||
if (tag.equals(TAB_IN))
|
||||
ad = apps_in;
|
||||
else if (tag.equals(TAB_UP))
|
||||
ad = apps_up;
|
||||
else
|
||||
ad = apps_av;
|
||||
|
||||
ListView lst = new ListView(FDroid.this);
|
||||
lst.setOnItemClickListener(FDroid.this);
|
||||
lst.setAdapter(ad);
|
||||
return lst;
|
||||
}
|
||||
};
|
||||
|
||||
// Create the tab of installed apps...
|
||||
ts = tabHost.newTabSpec(TAB_IN);
|
||||
ts.setIndicator(getString(R.string.tab_installed), getResources()
|
||||
.getDrawable(drawable.star_off));
|
||||
ts.setContent(tf);
|
||||
|
||||
// Create the tab of apps with updates...
|
||||
tsUp = tabHost.newTabSpec(TAB_UP);
|
||||
tsUp.setIndicator(getString(R.string.tab_updates), getResources()
|
||||
.getDrawable(drawable.star_on));
|
||||
tsUp.setContent(tf);
|
||||
|
||||
// Create the tab of available apps...
|
||||
ts1 = tabHost.newTabSpec(TAB_UN);
|
||||
ts1.setIndicator(getString(R.string.tab_noninstalled), getResources()
|
||||
.getDrawable(drawable.ic_input_add));
|
||||
ts1.setContent(tf);
|
||||
|
||||
tabHost.addTab(ts1);
|
||||
tabHost.addTab(ts);
|
||||
tabHost.addTab(tsUp);
|
||||
|
||||
}
|
||||
|
||||
// Populate the lists.
|
||||
// 'update' - true to update the installed status of the applications
|
||||
// by asking the system.
|
||||
private void populateLists(boolean update) {
|
||||
|
||||
apps_in.clear();
|
||||
apps_av.clear();
|
||||
apps_up.clear();
|
||||
|
||||
Vector<DB.App> apps = db.getApps(null, null, update);
|
||||
if (apps.isEmpty()) {
|
||||
// Don't attempt this more than once - we may have invalid
|
||||
// repositories.
|
||||
if (triedEmptyUpdate)
|
||||
return;
|
||||
// If there are no apps, update from the repos - it must be a
|
||||
// new installation.
|
||||
Log.d("FDroid", "Empty app list forces repo update");
|
||||
updateRepos();
|
||||
triedEmptyUpdate = true;
|
||||
return;
|
||||
}
|
||||
Log.d("FDroid", "Updating lists - " + apps.size() + " apps in total");
|
||||
|
||||
for (DB.App app : apps) {
|
||||
if (app.installedVersion == null) {
|
||||
apps_av.addItem(app);
|
||||
} else {
|
||||
apps_in.addItem(app);
|
||||
if (app.hasUpdates)
|
||||
apps_up.addItem(app);
|
||||
}
|
||||
}
|
||||
|
||||
// Update the count on the 'Updates' tab to show the number available.
|
||||
// This is quite unpleasant, but seems to be the only way to do it.
|
||||
TextView uptext = (TextView) tabHost.getTabWidget().getChildAt(2)
|
||||
.findViewById(android.R.id.title);
|
||||
uptext.setText(getString(R.string.tab_updates) + " ("
|
||||
+ Integer.toString(apps_up.getCount()) + ")");
|
||||
|
||||
// Tell the lists that the data behind the adapter has changed, so
|
||||
// they can refresh...
|
||||
apps_av.notifyDataSetChanged();
|
||||
apps_in.notifyDataSetChanged();
|
||||
apps_up.notifyDataSetChanged();
|
||||
|
||||
}
|
||||
|
||||
public boolean updateRepos() {
|
||||
pd = ProgressDialog.show(this, getString(R.string.process_wait_title),
|
||||
getString(R.string.process_update_msg), true);
|
||||
pd.setIcon(android.R.drawable.ic_dialog_info);
|
||||
|
||||
// Check for connection first!
|
||||
ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
if (netstate.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED
|
||||
|| netstate.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED) {
|
||||
new Thread() {
|
||||
public void run() {
|
||||
RepoXMLHandler.doUpdates(FDroid.this, db);
|
||||
update_handler.sendEmptyMessage(0);
|
||||
}
|
||||
}.start();
|
||||
return true;
|
||||
} else {
|
||||
pd.dismiss();
|
||||
Toast.makeText(FDroid.this, getString(R.string.connection_error),
|
||||
Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Handlers for thread functions that need to access GUI
|
||||
*/
|
||||
private Handler update_handler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
populateLists(true);
|
||||
if (pd.isShowing())
|
||||
pd.dismiss();
|
||||
}
|
||||
};
|
||||
|
||||
// Handler for a click on one of the items in an application list. Pops
|
||||
// up a dialog that shows the details of the application and all its
|
||||
// available versions, with buttons to allow installation etc.
|
||||
public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2,
|
||||
long arg3) {
|
||||
|
||||
final DB.App app;
|
||||
String curtab = tabHost.getCurrentTabTag();
|
||||
if (curtab.equalsIgnoreCase(TAB_IN)) {
|
||||
app = (DB.App) apps_in.getItem(arg2);
|
||||
} else if (curtab.equalsIgnoreCase(TAB_UP)) {
|
||||
app = (DB.App) apps_up.getItem(arg2);
|
||||
} else {
|
||||
app = (DB.App) apps_av.getItem(arg2);
|
||||
}
|
||||
|
||||
Intent intent = new Intent(this, AppDetails.class);
|
||||
intent.putExtra("appid", app.id);
|
||||
startActivityForResult(intent, REQUEST_APPDETAILS);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -26,6 +26,6 @@ public class FDroidApp extends Application {
|
||||
// don't want a database update to run. Incremented when entering
|
||||
// one, and decremented when leaving, so if it's 0 it ought to be
|
||||
// ok!
|
||||
public int inActivity=0;
|
||||
public int inActivity = 0;
|
||||
|
||||
}
|
||||
|
@ -42,203 +42,203 @@ import android.util.Log;
|
||||
|
||||
public class RepoXMLHandler extends DefaultHandler {
|
||||
|
||||
String mserver;
|
||||
String mserver;
|
||||
|
||||
private DB db;
|
||||
private DB db;
|
||||
|
||||
private DB.App curapp = null;
|
||||
private DB.Apk curapk = null;
|
||||
private String curchars = null;
|
||||
private DB.App curapp = null;
|
||||
private DB.Apk curapk = null;
|
||||
private String curchars = null;
|
||||
|
||||
public RepoXMLHandler(String srv, DB db) {
|
||||
mserver = srv;
|
||||
this.db = db;
|
||||
}
|
||||
public RepoXMLHandler(String srv, DB db) {
|
||||
mserver = srv;
|
||||
this.db = db;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void characters(char[] ch, int start, int length)
|
||||
throws SAXException {
|
||||
@Override
|
||||
public void characters(char[] ch, int start, int length)
|
||||
throws SAXException {
|
||||
|
||||
super.characters(ch, start, length);
|
||||
super.characters(ch, start, length);
|
||||
|
||||
String str = new String(ch).substring(start, start + length);
|
||||
if (curchars == null)
|
||||
curchars = str;
|
||||
else
|
||||
curchars += str;
|
||||
}
|
||||
String str = new String(ch).substring(start, start + length);
|
||||
if (curchars == null)
|
||||
curchars = str;
|
||||
else
|
||||
curchars += str;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String localName, String qName)
|
||||
throws SAXException {
|
||||
@Override
|
||||
public void endElement(String uri, String localName, String qName)
|
||||
throws SAXException {
|
||||
|
||||
super.endElement(uri, localName, qName);
|
||||
String curel = localName;
|
||||
String str = curchars;
|
||||
super.endElement(uri, localName, qName);
|
||||
String curel = localName;
|
||||
String str = curchars;
|
||||
|
||||
if (curel == "application" && curapp != null) {
|
||||
Log.d("FDroid", "Repo: Updating application " + curapp.id);
|
||||
db.updateApplication(curapp);
|
||||
getIcon(curapp);
|
||||
curapp = null;
|
||||
} else if (curel == "package" && curapk != null && curapp != null) {
|
||||
Log.d("FDroid", "Repo: Package added (" + curapk.version + ")");
|
||||
curapp.apks.add(curapk);
|
||||
curapk = null;
|
||||
} else if (curapk != null && str != null) {
|
||||
if (curel == "version") {
|
||||
curapk.version = str;
|
||||
} else if (curel == "versioncode") {
|
||||
try {
|
||||
curapk.vercode = Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
curapk.vercode = 0;
|
||||
}
|
||||
} else if (curel == "size") {
|
||||
try {
|
||||
curapk.size = Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
curapk.size = 0;
|
||||
}
|
||||
} else if (curel == "hash") {
|
||||
curapk.hash = str;
|
||||
} else if (curel == "apkname") {
|
||||
curapk.apkName = str;
|
||||
} else if (curel == "apksource") {
|
||||
curapk.apkSource = str;
|
||||
}
|
||||
} else if (curapp != null && str != null) {
|
||||
if (curel == "id") {
|
||||
Log.d("FDroid", "App id is " + str);
|
||||
curapp.id = str;
|
||||
} else if (curel == "name") {
|
||||
curapp.name = str;
|
||||
} else if (curel == "icon") {
|
||||
curapp.icon = str;
|
||||
} else if (curel == "description") {
|
||||
curapp.description = str;
|
||||
} else if (curel == "summary") {
|
||||
curapp.summary = str;
|
||||
} else if (curel == "license") {
|
||||
curapp.license = str;
|
||||
} else if (curel == "source") {
|
||||
curapp.sourceURL = str;
|
||||
} else if (curel == "web") {
|
||||
curapp.webURL = str;
|
||||
} else if (curel == "tracker") {
|
||||
curapp.trackerURL = str;
|
||||
} else if (curel == "marketversion") {
|
||||
curapp.marketVersion = str;
|
||||
} else if (curel == "marketvercode") {
|
||||
try {
|
||||
curapp.marketVercode = Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
curapp.marketVercode = 0;
|
||||
}
|
||||
} else if (curel == "antifeatures") {
|
||||
curapp.antiFeatures = str;
|
||||
}
|
||||
}
|
||||
if (curel == "application" && curapp != null) {
|
||||
Log.d("FDroid", "Repo: Updating application " + curapp.id);
|
||||
db.updateApplication(curapp);
|
||||
getIcon(curapp);
|
||||
curapp = null;
|
||||
} else if (curel == "package" && curapk != null && curapp != null) {
|
||||
Log.d("FDroid", "Repo: Package added (" + curapk.version + ")");
|
||||
curapp.apks.add(curapk);
|
||||
curapk = null;
|
||||
} else if (curapk != null && str != null) {
|
||||
if (curel == "version") {
|
||||
curapk.version = str;
|
||||
} else if (curel == "versioncode") {
|
||||
try {
|
||||
curapk.vercode = Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
curapk.vercode = 0;
|
||||
}
|
||||
} else if (curel == "size") {
|
||||
try {
|
||||
curapk.size = Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
curapk.size = 0;
|
||||
}
|
||||
} else if (curel == "hash") {
|
||||
curapk.hash = str;
|
||||
} else if (curel == "apkname") {
|
||||
curapk.apkName = str;
|
||||
} else if (curel == "apksource") {
|
||||
curapk.apkSource = str;
|
||||
}
|
||||
} else if (curapp != null && str != null) {
|
||||
if (curel == "id") {
|
||||
Log.d("FDroid", "App id is " + str);
|
||||
curapp.id = str;
|
||||
} else if (curel == "name") {
|
||||
curapp.name = str;
|
||||
} else if (curel == "icon") {
|
||||
curapp.icon = str;
|
||||
} else if (curel == "description") {
|
||||
curapp.description = str;
|
||||
} else if (curel == "summary") {
|
||||
curapp.summary = str;
|
||||
} else if (curel == "license") {
|
||||
curapp.license = str;
|
||||
} else if (curel == "source") {
|
||||
curapp.sourceURL = str;
|
||||
} else if (curel == "web") {
|
||||
curapp.webURL = str;
|
||||
} else if (curel == "tracker") {
|
||||
curapp.trackerURL = str;
|
||||
} else if (curel == "marketversion") {
|
||||
curapp.marketVersion = str;
|
||||
} else if (curel == "marketvercode") {
|
||||
try {
|
||||
curapp.marketVercode = Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
curapp.marketVercode = 0;
|
||||
}
|
||||
} else if (curel == "antifeatures") {
|
||||
curapp.antiFeatures = str;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName,
|
||||
Attributes attributes) throws SAXException {
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName,
|
||||
Attributes attributes) throws SAXException {
|
||||
|
||||
super.startElement(uri, localName, qName, attributes);
|
||||
if (localName == "application" && curapp == null) {
|
||||
Log.d("FDroid", "Repo: Found application at " + mserver);
|
||||
curapp = new DB.App();
|
||||
} else if (localName == "package" && curapp != null && curapk == null) {
|
||||
Log.d("FDroid", "Repo: Found package for " + curapp.id);
|
||||
curapk = new DB.Apk();
|
||||
curapk.id = curapp.id;
|
||||
curapk.server = mserver;
|
||||
}
|
||||
curchars = null;
|
||||
}
|
||||
super.startElement(uri, localName, qName, attributes);
|
||||
if (localName == "application" && curapp == null) {
|
||||
Log.d("FDroid", "Repo: Found application at " + mserver);
|
||||
curapp = new DB.App();
|
||||
} else if (localName == "package" && curapp != null && curapk == null) {
|
||||
Log.d("FDroid", "Repo: Found package for " + curapp.id);
|
||||
curapk = new DB.Apk();
|
||||
curapk.id = curapp.id;
|
||||
curapk.server = mserver;
|
||||
}
|
||||
curchars = null;
|
||||
}
|
||||
|
||||
private void getIcon(DB.App app) {
|
||||
try {
|
||||
private void getIcon(DB.App app) {
|
||||
try {
|
||||
|
||||
String destpath = DB.getIconsPath() + app.icon;
|
||||
File f = new File(destpath);
|
||||
if (f.exists())
|
||||
return;
|
||||
String destpath = DB.getIconsPath() + app.icon;
|
||||
File f = new File(destpath);
|
||||
if (f.exists())
|
||||
return;
|
||||
|
||||
BufferedInputStream getit = new BufferedInputStream(new URL(mserver
|
||||
+ "/icons/" + app.icon).openStream());
|
||||
FileOutputStream saveit = new FileOutputStream(destpath);
|
||||
BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024);
|
||||
byte data[] = new byte[1024];
|
||||
BufferedInputStream getit = new BufferedInputStream(new URL(mserver
|
||||
+ "/icons/" + app.icon).openStream());
|
||||
FileOutputStream saveit = new FileOutputStream(destpath);
|
||||
BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024);
|
||||
byte data[] = new byte[1024];
|
||||
|
||||
int readed = getit.read(data, 0, 1024);
|
||||
while (readed != -1) {
|
||||
bout.write(data, 0, readed);
|
||||
readed = getit.read(data, 0, 1024);
|
||||
}
|
||||
bout.close();
|
||||
getit.close();
|
||||
saveit.close();
|
||||
} catch (Exception e) {
|
||||
int readed = getit.read(data, 0, 1024);
|
||||
while (readed != -1) {
|
||||
bout.write(data, 0, readed);
|
||||
readed = getit.read(data, 0, 1024);
|
||||
}
|
||||
bout.close();
|
||||
getit.close();
|
||||
saveit.close();
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void doUpdates(Context ctx, DB db) {
|
||||
db.beginUpdate();
|
||||
Vector<DB.Repo> repos = db.getRepos();
|
||||
for (DB.Repo repo : repos) {
|
||||
if (repo.inuse) {
|
||||
public static void doUpdates(Context ctx, DB db) {
|
||||
db.beginUpdate();
|
||||
Vector<DB.Repo> repos = db.getRepos();
|
||||
for (DB.Repo repo : repos) {
|
||||
if (repo.inuse) {
|
||||
|
||||
try {
|
||||
try {
|
||||
|
||||
FileOutputStream f = ctx.openFileOutput("tempindex.xml",
|
||||
Context.MODE_PRIVATE);
|
||||
FileOutputStream f = ctx.openFileOutput("tempindex.xml",
|
||||
Context.MODE_PRIVATE);
|
||||
|
||||
// Download the index file from the repo...
|
||||
BufferedInputStream getit = new BufferedInputStream(
|
||||
new URL(repo.address + "/index.xml").openStream());
|
||||
// Download the index file from the repo...
|
||||
BufferedInputStream getit = new BufferedInputStream(
|
||||
new URL(repo.address + "/index.xml").openStream());
|
||||
|
||||
BufferedOutputStream bout = new BufferedOutputStream(f,
|
||||
1024);
|
||||
byte data[] = new byte[1024];
|
||||
BufferedOutputStream bout = new BufferedOutputStream(f,
|
||||
1024);
|
||||
byte data[] = new byte[1024];
|
||||
|
||||
int readed = getit.read(data, 0, 1024);
|
||||
while (readed != -1) {
|
||||
bout.write(data, 0, readed);
|
||||
readed = getit.read(data, 0, 1024);
|
||||
}
|
||||
bout.close();
|
||||
getit.close();
|
||||
f.close();
|
||||
int readed = getit.read(data, 0, 1024);
|
||||
while (readed != -1) {
|
||||
bout.write(data, 0, readed);
|
||||
readed = getit.read(data, 0, 1024);
|
||||
}
|
||||
bout.close();
|
||||
getit.close();
|
||||
f.close();
|
||||
|
||||
// Process the index...
|
||||
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||
SAXParser sp = spf.newSAXParser();
|
||||
XMLReader xr = sp.getXMLReader();
|
||||
RepoXMLHandler handler = new RepoXMLHandler(repo.address,
|
||||
db);
|
||||
xr.setContentHandler(handler);
|
||||
// Process the index...
|
||||
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||
SAXParser sp = spf.newSAXParser();
|
||||
XMLReader xr = sp.getXMLReader();
|
||||
RepoXMLHandler handler = new RepoXMLHandler(repo.address,
|
||||
db);
|
||||
xr.setContentHandler(handler);
|
||||
|
||||
InputStreamReader isr = new FileReader(new File(ctx
|
||||
.getFilesDir()
|
||||
+ "/tempindex.xml"));
|
||||
InputSource is = new InputSource(isr);
|
||||
xr.parse(is);
|
||||
InputStreamReader isr = new FileReader(new File(ctx
|
||||
.getFilesDir()
|
||||
+ "/tempindex.xml"));
|
||||
InputSource is = new InputSource(isr);
|
||||
xr.parse(is);
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.d("FDroid", "Exception updating from " + repo.address
|
||||
+ " - " + e.getMessage());
|
||||
} finally {
|
||||
ctx.deleteFile("tempindex.xml");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.d("FDroid", "Exception updating from " + repo.address
|
||||
+ " - " + e.getMessage());
|
||||
} finally {
|
||||
ctx.deleteFile("tempindex.xml");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
db.endUpdate();
|
||||
}
|
||||
}
|
||||
db.endUpdate();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,129 +35,129 @@ import android.util.Log;
|
||||
|
||||
public class UpdateService extends Service {
|
||||
|
||||
// Schedule (or cancel schedule for) this service, according to the
|
||||
// current preferences. Should be called a) at boot, or b) if the preference
|
||||
// is changed.
|
||||
// TODO: What if we get upgraded?
|
||||
public static void schedule(Context ctx) {
|
||||
// Schedule (or cancel schedule for) this service, according to the
|
||||
// current preferences. Should be called a) at boot, or b) if the preference
|
||||
// is changed.
|
||||
// TODO: What if we get upgraded?
|
||||
public static void schedule(Context ctx) {
|
||||
|
||||
SharedPreferences prefs = PreferenceManager
|
||||
.getDefaultSharedPreferences(ctx);
|
||||
String sint = prefs.getString("updateInterval", "0");
|
||||
int interval = Integer.parseInt(sint);
|
||||
SharedPreferences prefs = PreferenceManager
|
||||
.getDefaultSharedPreferences(ctx);
|
||||
String sint = prefs.getString("updateInterval", "0");
|
||||
int interval = Integer.parseInt(sint);
|
||||
|
||||
Intent intent = new Intent(ctx, UpdateService.class);
|
||||
PendingIntent pending = PendingIntent.getService(ctx, 0, intent, 0);
|
||||
Intent intent = new Intent(ctx, UpdateService.class);
|
||||
PendingIntent pending = PendingIntent.getService(ctx, 0, intent, 0);
|
||||
|
||||
AlarmManager alarm = (AlarmManager) ctx
|
||||
.getSystemService(Context.ALARM_SERVICE);
|
||||
alarm.cancel(pending);
|
||||
if (interval > 0) {
|
||||
alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
|
||||
SystemClock.elapsedRealtime() + 5000,
|
||||
AlarmManager.INTERVAL_HOUR, pending);
|
||||
}
|
||||
AlarmManager alarm = (AlarmManager) ctx
|
||||
.getSystemService(Context.ALARM_SERVICE);
|
||||
alarm.cancel(pending);
|
||||
if (interval > 0) {
|
||||
alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
|
||||
SystemClock.elapsedRealtime() + 5000,
|
||||
AlarmManager.INTERVAL_HOUR, pending);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// For API levels <5
|
||||
@Override
|
||||
public void onStart(Intent intent, int startId) {
|
||||
handleCommand();
|
||||
}
|
||||
// For API levels <5
|
||||
@Override
|
||||
public void onStart(Intent intent, int startId) {
|
||||
handleCommand();
|
||||
}
|
||||
|
||||
// For API levels >=5
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
handleCommand();
|
||||
return START_REDELIVER_INTENT;
|
||||
}
|
||||
// For API levels >=5
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
handleCommand();
|
||||
return START_REDELIVER_INTENT;
|
||||
}
|
||||
|
||||
private void handleCommand() {
|
||||
private void handleCommand() {
|
||||
|
||||
new Thread() {
|
||||
public void run() {
|
||||
new Thread() {
|
||||
public void run() {
|
||||
|
||||
// If we're in one of our list activities, we don't want
|
||||
// to run an update because the database will be out of
|
||||
// sync with the display.
|
||||
if (((FDroidApp) getApplication()).inActivity != 0)
|
||||
return;
|
||||
// If we're in one of our list activities, we don't want
|
||||
// to run an update because the database will be out of
|
||||
// sync with the display.
|
||||
if (((FDroidApp) getApplication()).inActivity != 0)
|
||||
return;
|
||||
|
||||
// See if it's time to actually do anything yet...
|
||||
SharedPreferences prefs = PreferenceManager
|
||||
.getDefaultSharedPreferences(getBaseContext());
|
||||
long lastUpdate = prefs.getLong("lastUpdateCheck", 0);
|
||||
String sint = prefs.getString("updateInterval", "0");
|
||||
int interval = Integer.parseInt(sint);
|
||||
if (interval == 0)
|
||||
return;
|
||||
if (lastUpdate + (interval * 60 * 60) > System
|
||||
.currentTimeMillis())
|
||||
return;
|
||||
// See if it's time to actually do anything yet...
|
||||
SharedPreferences prefs = PreferenceManager
|
||||
.getDefaultSharedPreferences(getBaseContext());
|
||||
long lastUpdate = prefs.getLong("lastUpdateCheck", 0);
|
||||
String sint = prefs.getString("updateInterval", "0");
|
||||
int interval = Integer.parseInt(sint);
|
||||
if (interval == 0)
|
||||
return;
|
||||
if (lastUpdate + (interval * 60 * 60) > System
|
||||
.currentTimeMillis())
|
||||
return;
|
||||
|
||||
// Make sure we have a connection...
|
||||
ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
if (netstate.getNetworkInfo(1).getState() != NetworkInfo.State.CONNECTED
|
||||
&& netstate.getNetworkInfo(0).getState() != NetworkInfo.State.CONNECTED)
|
||||
return;
|
||||
// Make sure we have a connection...
|
||||
ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
if (netstate.getNetworkInfo(1).getState() != NetworkInfo.State.CONNECTED
|
||||
&& netstate.getNetworkInfo(0).getState() != NetworkInfo.State.CONNECTED)
|
||||
return;
|
||||
|
||||
// Do the update...
|
||||
DB db = null;
|
||||
try {
|
||||
db = new DB(getBaseContext());
|
||||
boolean notify = prefs.getBoolean("updateNotify", false);
|
||||
// Do the update...
|
||||
DB db = null;
|
||||
try {
|
||||
db = new DB(getBaseContext());
|
||||
boolean notify = prefs.getBoolean("updateNotify", false);
|
||||
|
||||
// Get the number of updates available before we
|
||||
// start, so we can notify if there are new ones.
|
||||
// (But avoid doing it if the user doesn't want
|
||||
// notifications, since it may be time consuming)
|
||||
int prevUpdates = 0;
|
||||
if (notify)
|
||||
prevUpdates = db.getNumUpdates();
|
||||
// Get the number of updates available before we
|
||||
// start, so we can notify if there are new ones.
|
||||
// (But avoid doing it if the user doesn't want
|
||||
// notifications, since it may be time consuming)
|
||||
int prevUpdates = 0;
|
||||
if (notify)
|
||||
prevUpdates = db.getNumUpdates();
|
||||
|
||||
RepoXMLHandler.doUpdates(getBaseContext(), db);
|
||||
RepoXMLHandler.doUpdates(getBaseContext(), db);
|
||||
|
||||
if (notify) {
|
||||
if (db.getNumUpdates() > prevUpdates) {
|
||||
// And the user wants to know.
|
||||
NotificationManager n = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
Notification notification = new Notification(
|
||||
R.drawable.icon,
|
||||
"FDroid Updates Available", System
|
||||
.currentTimeMillis());
|
||||
Context context = getApplicationContext();
|
||||
CharSequence contentTitle = "FDroid";
|
||||
CharSequence contentText = "Updates are available.";
|
||||
Intent notificationIntent = new Intent(
|
||||
UpdateService.this, FDroid.class);
|
||||
PendingIntent contentIntent = PendingIntent
|
||||
.getActivity(UpdateService.this, 0,
|
||||
notificationIntent, 0);
|
||||
notification.setLatestEventInfo(context,
|
||||
contentTitle, contentText, contentIntent);
|
||||
notification.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||
n.notify(1, notification);
|
||||
}
|
||||
}
|
||||
if (notify) {
|
||||
if (db.getNumUpdates() > prevUpdates) {
|
||||
// And the user wants to know.
|
||||
NotificationManager n = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
Notification notification = new Notification(
|
||||
R.drawable.icon,
|
||||
"FDroid Updates Available", System
|
||||
.currentTimeMillis());
|
||||
Context context = getApplicationContext();
|
||||
CharSequence contentTitle = "FDroid";
|
||||
CharSequence contentText = "Updates are available.";
|
||||
Intent notificationIntent = new Intent(
|
||||
UpdateService.this, FDroid.class);
|
||||
PendingIntent contentIntent = PendingIntent
|
||||
.getActivity(UpdateService.this, 0,
|
||||
notificationIntent, 0);
|
||||
notification.setLatestEventInfo(context,
|
||||
contentTitle, contentText, contentIntent);
|
||||
notification.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||
n.notify(1, notification);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.d("FDroid", "Exception during handleCommand() - "
|
||||
+ e.getMessage());
|
||||
} finally {
|
||||
if (db != null)
|
||||
db.close();
|
||||
stopSelf();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.d("FDroid", "Exception during handleCommand() - "
|
||||
+ e.getMessage());
|
||||
} finally {
|
||||
if (db != null)
|
||||
db.close();
|
||||
stopSelf();
|
||||
}
|
||||
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
}.start();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user