/*
* Copyright 2015 Daniel Dittmar
*
* 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 dan.dit.whatsthat.system;
import android.app.Activity;
import android.content.ClipData;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import dan.dit.whatsthat.R;
import dan.dit.whatsthat.image.ImageObfuscator;
import dan.dit.whatsthat.preferences.User;
import dan.dit.whatsthat.util.general.VersionSafe;
import dan.dit.whatsthat.util.image.BitmapUtil;
import dan.dit.whatsthat.util.image.ImageUtil;
/**
* Created by daniel on 13.10.15.
*/
public class ReceiveObfuscatedActivity extends Activity {
private File mDataFile;
private InputStream mDataStream;
private String mName;
private Button mAccept;
private Bitmap mObfuscated;
private AsyncTask<Void, Integer, Object> mPrepareTask;
private Button mRefuse;
private ProgressBar mProgressWorking;
private View mFailExplanation;
private URL mDataDownloadLink;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("HomeStuff", "Receiveobfuscated activity created.");
if (getIntent().getAction().equals(Intent.ACTION_VIEW)) {
Uri uri = getIntent().getData();
if (uri != null) {
attemptExtractFromUri(uri);
} else {
ClipData data = VersionSafe.getClipData(getIntent());
if (data != null && data.getItemCount() > 0) {
ClipData.Item item = data.getItemAt(0);
attemptExtractFromUri(item.getUri());
}
}
}
boolean hasValidData = (mDataFile != null && mDataFile.exists()) || mDataStream != null
|| mDataDownloadLink != null;
super.onCreate(savedInstanceState);
if (hasValidData) {
setContentView(R.layout.receive_obfuscated_image);
mFailExplanation = findViewById(R.id.obfuscated_fail_explanation);
mFailExplanation.setVisibility(View.GONE);
mRefuse = (Button) findViewById(R.id.obfuscated_refuse);
mRefuse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mProgressWorking = (ProgressBar) findViewById(R.id.obfuscated_progress);
mAccept = (Button) findViewById(R.id.obfuscated_accept);
mAccept.setEnabled(false);
mAccept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mProgressWorking.setVisibility(View.VISIBLE);
mAccept.setEnabled(false);
mPrepareTask = new AsyncTask<Void, Integer, Object>() {
@Override
protected Object doInBackground(Void... params) {
int result = ImageObfuscator.registerObfuscated(getApplicationContext(), mObfuscated, mName);
Log.d("HomeStuff", "Result for registering obfuscation: " + result);
return result;
}
@Override
public void onCancelled() {
mProgressWorking.setVisibility(View.GONE);
}
@Override
public void onPostExecute(Object result) {
Integer resultValue = result != null ? (Integer) result : null;
if (resultValue != null && resultValue == ImageObfuscator.RESULT_REGISTRATION_SUCCESS_NO_RIDDLE) {
Toast.makeText(getApplicationContext(), R.string.obfuscated_loading_success_no_riddle, Toast.LENGTH_LONG).show();
} else if (resultValue != null && resultValue == ImageObfuscator.RESULT_REGISTRATION_SUCCESS_WITH_RIDDLE) {
Toast.makeText(getApplicationContext(), R.string.obfuscated_loading_success_with_riddle, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), R.string.obfuscated_loading_failed, Toast.LENGTH_SHORT).show();
}
mProgressWorking.setVisibility(View.GONE);
finish();
if (result != null) {
Intent intent = new Intent(getApplicationContext(), RiddleActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
}
}.execute();
}
});
prepareData();
} else {
Log.d("HomeStuff", "No valid data found in intent " + getIntent());
setResult(RESULT_CANCELED);
finish();
}
}
private void attemptExtractFromUri(Uri uri) {
Log.d("HomeStuff", "Found uri for obfuscated activity: " + uri);
if (uri.getScheme().equals("file")) {
String path = uri.getPath();
if (path != null) {
mDataFile = new File(path);
mName = mDataFile.getName();
}
} else if (uri.getScheme().equals("content")) {
try {
mDataStream = getContentResolver().openInputStream(uri);
mName = uri.getHost();
if (mName == null) {
mName = uri.getLastPathSegment();
}
if (mName == null) {
mName = uri.getUserInfo();
}
} catch (FileNotFoundException fnf) {
//bad luck
}
} else if (uri.getScheme().equals("https") || uri.getScheme().equals("http")) {
List<String> segments = uri.getPathSegments();
if (segments != null && segments.size() > 1) {
mName = segments.get(segments.size() - 1);
mDataDownloadLink = User.getInstance().getWebPhotoStorage()
.makeDownloadLink(uri);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPrepareTask != null) {
mPrepareTask.cancel(true);
}
}
private void prepareData() {
mProgressWorking.setVisibility(View.VISIBLE);
mPrepareTask = new AsyncTask<Void, Integer, Object>() {
@Override
protected Object doInBackground(Void... params) {
//load bitmap and check if it is a valid obfuscated image
if (mDataFile != null) {
mObfuscated = ImageUtil.loadBitmap(mDataFile, 0, 0, true);
} else if (mDataStream != null) {
mObfuscated = ImageUtil.loadBitmap(mDataStream, 0, 0, BitmapUtil.MODE_FIT_EXACT);
} else if (mDataDownloadLink != null) {
File tempFile = User.getInstance().getWebPhotoStorage().download
(mDataDownloadLink,
null);
if (tempFile != null) {
mObfuscated = ImageUtil.loadBitmap(tempFile, 0, 0, true);
}
}
return null;
}
@Override
public void onCancelled() {
mProgressWorking.setVisibility(View.GONE);
}
@Override
public void onPostExecute(Object nothing) {
mProgressWorking.setVisibility(View.GONE);
boolean imageFound = mObfuscated != null;
if (!ImageObfuscator.checkIfValidObfuscatedImage(mObfuscated)) {
mObfuscated = null;
}
if (mObfuscated != null) {
mAccept.setEnabled(true);
} else {
if (mDataDownloadLink == null) {
mFailExplanation.setVisibility(View.VISIBLE);
}
Toast.makeText(getApplicationContext(), !imageFound ? R.string
.obfuscated_not_loadable : R.string
.obfuscated_not_valid_when_loading, Toast.LENGTH_LONG).show();
}
}
}.execute();
}
}