| /* |
| * Copyright (C) 2007 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.quake.llvm; |
| |
| import android.app.Activity; |
| import android.content.res.Resources; |
| import android.os.Bundle; |
| import android.util.Log; |
| import android.view.WindowManager; |
| import android.view.Menu; |
| import android.view.MenuItem; |
| import android.view.MenuInflater; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import android.view.View; |
| |
| |
| public class QuakeActivity extends Activity { |
| |
| QuakeView mQuakeView; |
| |
| static QuakeLib mQuakeLib; |
| |
| boolean mKeepScreenOn = true; |
| |
| @Override protected void onCreate(Bundle icicle) { |
| Log.i("QuakeActivity", "onCreate"); |
| super.onCreate(icicle); |
| if (USE_DOWNLOADER) { |
| if (! DownloaderActivity.ensureDownloaded(this, |
| getString(R.string.quake_customDownloadText), FILE_CONFIG_URL, |
| CONFIG_VERSION, SDCARD_DATA_PATH, USER_AGENT)) { |
| return; |
| } |
| } |
| |
| if (foundQuakeData()) { |
| byte[] pgm = null; |
| int pgmLength = 0; |
| if (QuakeLib.gdk()) |
| { |
| // HACK: create faked view in order to read bitcode in resource |
| View view = new View(getApplication()); |
| |
| // read bitcode in res |
| InputStream is = view.getResources().openRawResource(R.raw.libquake_portable); |
| try { |
| try { |
| pgm = new byte[1024]; |
| pgmLength = 0; |
| |
| while(true) { |
| int bytesLeft = pgm.length - pgmLength; |
| if (bytesLeft == 0) { |
| byte[] buf2 = new byte[pgm.length * 2]; |
| System.arraycopy(pgm, 0, buf2, 0, pgm.length); |
| pgm = buf2; |
| bytesLeft = pgm.length - pgmLength; |
| } |
| int bytesRead = is.read(pgm, pgmLength, bytesLeft); |
| if (bytesRead <= 0) { |
| break; |
| } |
| pgmLength += bytesRead; |
| } |
| } finally { |
| is.close(); |
| } |
| } catch(IOException e) { |
| throw new Resources.NotFoundException(); |
| } |
| } |
| // |
| if (mQuakeLib == null) { |
| mQuakeLib = new QuakeLib(pgm, pgmLength); |
| if(! mQuakeLib.init()) { |
| setContentView(new QuakeViewNoData( |
| getApplication(), |
| QuakeViewNoData.E_INITFAILED)); |
| return; |
| } |
| } |
| |
| if (mKeepScreenOn) { |
| getWindow().setFlags( |
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, |
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); |
| } |
| |
| if (mQuakeView == null) { |
| mQuakeView = new |
| QuakeView(getApplication()); |
| mQuakeView.setQuakeLib(mQuakeLib); |
| } |
| setContentView(mQuakeView); |
| } |
| else { |
| setContentView(new QuakeViewNoData(getApplication(), |
| QuakeViewNoData.E_NODATA)); |
| } |
| } |
| |
| @Override protected void onPause() { |
| super.onPause(); |
| if (mQuakeView != null) { |
| mQuakeView.onPause(); |
| } |
| } |
| |
| @Override protected void onResume() { |
| super.onResume(); |
| if (mQuakeView != null) { |
| mQuakeView.onResume(); |
| } |
| } |
| |
| @Override protected void onDestroy() { |
| super.onDestroy(); |
| if (mQuakeLib != null) { |
| mQuakeLib.quit(); |
| } |
| } |
| |
| @Override |
| public boolean onCreateOptionsMenu(Menu menu) { |
| MenuInflater inflater = getMenuInflater(); |
| inflater.inflate(R.menu.menu, menu); |
| return true; |
| } |
| |
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| switch (item.getItemId()) { |
| case R.id.switch_mode: |
| if (mQuakeView != null) { |
| mQuakeView.switchMode(); |
| } |
| return true; |
| default: |
| return super.onOptionsItemSelected(item); |
| } |
| } |
| |
| private boolean foundQuakeData() { |
| return fileExists(SDCARD_DATA_PATH + PAK0_PATH) |
| || fileExists(INTERNAL_DATA_PATH + PAK0_PATH); |
| } |
| |
| private boolean fileExists(String s) { |
| File f = new File(s); |
| return f.exists(); |
| } |
| |
| private final static boolean USE_DOWNLOADER = false; |
| |
| private final static String FILE_CONFIG_URL = |
| "http://example.com/android/quake/quake11.config"; |
| private final static String CONFIG_VERSION = "1.1"; |
| private final static String SDCARD_DATA_PATH = "/sdcard/data/quake"; |
| private final static String INTERNAL_DATA_PATH = "/data/quake"; |
| private final static String PAK0_PATH = "/id1/pak0.pak"; |
| private final static String USER_AGENT = "Android Quake Downloader"; |
| |
| } |